Node.js 有承诺的猫鼬

Node.js 有承诺的猫鼬,node.js,mongoose,when-js,Node.js,Mongoose,When Js,我使用when.js作为mongoose的promise库,尝试获取不同的集合字段,并将结果作为promise返回 mongoose.Promise= require("when"); function getPromisedDistinct(startDate, endDate) { return when.promise(function(resolve, reject) { $log.distinct("keys", { dat

我使用when.js作为mongoose的promise库,尝试获取不同的集合字段,并将结果作为promise返回

 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);
            });
    });
 }
然而,getPromisedInstinct是通过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 GetPromisedInstinct称为

    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。如果这与本机承诺(以及bluebird和q)一样有效,那么您不需要将查询包装在承诺中,mongoose会为您这样做(一旦您使用
exec()
),因此您的代码可以这样编写:

function getPromisedDistinct(startDate, endDate) {
    return $log.distinct("keys", {
                datetime: {
                    "$gte": startDate,
                    "$lt": endDate
                }
            }).exec()
    });
 }
您可以对
agg
函数执行相同的操作

正如@robertklep在评论中指出的,没有必要在
getPromisedInstinct
中包含
then
块,因为这是不必要的混乱(请参阅。您已经在使用
return$log.distinct…
返回承诺对象,然后在
agg
函数中访问该值

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

Mongoose使用ES6本机promises、bluebird和q进行测试。任何导出ES6风格promise构造函数的promise库在理论上都应该可以工作,但理论往往与实践不同。如果发现错误,请在GitHub上打开问题


我在返回的结果上使用
then
,但解析的值是promise函数,所以如果您使用的是node,那么如果您在v0.12.x上,您可以使用本机promises
,那么(function(keys){return keys;})
有点反模式:-)