2016-01-27 2 views
2

я использую when.js как библиотека посыла для мангустов и попытаться получить отчетливый подал сбора и возврата результата как обещаютMongoose отличаются обещаниями

mongoose.Promise= require("when"); 

function getPromisedDistinct(startDate, endDate) { 
    return when.promise(function(resolve, reject) { 
     $log.distinct("keys", { 
       datetime: { 
        "$gte": startDate, 
        "$lt": endDate 
       } 
      }).exec() 
      .then(function(res) { 
       return resolve(res); 
      }); 
    }); 
} 

однако getPromisedDistinct решается с функцией посыла

function (resolve, reject) { 
    if (!_this.op) { 
     callback && callback(null, undefined); 
     resolve(); 
     return; 
    } 

    _this[_this.op].call(_this, function(error, res) { 
     if (error) { 
     callback && callback(error); 
     reject(error); 
     return; 
     } 
     callback && callback.apply(null, arguments); 
     resolve(res); 
    }); 
    } 

редактировать # 1 getPromisedDistinct называется

function agg(day, startDate, endDate) { 
     return when.promise(function(resolve, reject) { 
     getPromisedDistinct(startDate, endDate).then(function(keys) { 
      log.data("keys is : \n" + licence_keys); 
     }).otherwise(function(keys) { 
      return reject(err); 
     }); 
    }); 
} 

Почему это не решилось?

ответ

1

Вы указали, что Mongoose использует when.js для своей библиотеки Promise. Если это работает так же, как с нативными обещаниями (и, казалось бы, bluebird и q), вам не нужно обертывать запросы в обещании, mongoose сделает это за вас (как только вы используете exec()), поэтому ваш код может быть записан как таковой:

function getPromisedDistinct(startDate, endDate) { 
    return $log.distinct("keys", { 
       datetime: { 
        "$gte": startDate, 
        "$lt": endDate 
       } 
      }).exec() 
    }); 
} 

Вы можете сделать то же самое с вашей функцией agg.

Как @robertklep отметил в комментариях нет необходимости включать then блок в getPromisedDistinct, потому что это ненужный (см promise anti-patterns. Вы уже возвращаетесь объект посыла с return $log.distinct..., а затем доступом к этому значению в вашей agg функции.

Это стоит принимать во внимание документации мангуста на затыкать в библиотеке обещаний:.

Mongoose тесты с ES6 носителями обещаний, Bluebird, и д Любой библиотека обещания, которое экспортирует обещание конструктор ES6 стиля должны Wo rk в теории, но теория часто отличается от практики. Если вы нашли ошибку, открыть вопрос на GitHub

+0

я использую 'затем' на возвращенном результате, но разрешенное значение функция обещания –

+0

также вы используете узел, так что если вы на v0.12.x и вы можете использовать нативные обещания – br3w5

+0

'.then (function (keys) {return keys;})' немного анти-шаблон :-) – robertklep

Смежные вопросы