mongoose与承诺不同

我使用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是用promise函数解决的

 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); }); }); } 

为什么这不解决价值?

您已经指示Mongoose为其Promise库使用when.js。 如果这和原生承诺(看似蓝鸟和q)一样,你不需要在一个承诺中包装查询,mongoose会为你做这件事(一旦你使用exec() ),所以你的代码可以写成这样:

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

你可以用你的agg函数做同样的事情。

正如@robertklep在注释中指出的那样,不需要在getPromisedDistinct包含一个then块,因为这是不必要的混乱(见诺言反模式) ,你已经返回了promise对象, return $log.distinct...然后访问在你的agg函数中的值。

值得注意的是Mongoose关于插入Promise库的文档:

MongoosetestingES6原生承诺,蓝鸟和q。 任何出口ES6型承诺构造函数的承诺库都应该在理论上工作,但理论往往与实践有所不同。 如果您发现错误,请在GitHub上打开一个问题