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

为什么这不解决价值?

4

1 回答 1

1

您已指示 Mongoose 将 when.js 用于其 Promise 库。如果这与原生 Promise(以及看似 bluebird 和 q)的工作方式一样,您不需要将查询包装在 Promise 中,mongoose 会为您执行此操作(一旦您使用exec()),因此您的代码可以这样编写:

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

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

正如@robertklep 在评论中指出的那样,没有必要在其中包含一个then块,getPromisedDistinct因为它是不必要的混乱(参见promise anti-patterns。您已经在返回 promise 对象,return $log.distinct...然后在agg函数中访问该值。

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

使用 ES6 原生 Promise、bluebird 和 q 进行 Mongoose 测试。任何导出 ES6 风格的 Promise 构造函数的 Promise 库在理论上都应该有效,但理论通常与实践不同。如果发现错误,请在 GitHub 上打开问题

于 2016-01-27T15:59:21.313 回答