gpt4 book ai didi

node.js - Mongoose 与 promise 截然不同

转载 作者:太空宇宙 更新时间:2023-11-03 22:13:43 26 4
gpt4 key购买 nike

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

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

编辑#1getPromisedDistinct 被称为

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

为什么这没有解决值(value)?

最佳答案

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

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

您可以对 agg 函数执行相同的操作。

正如 @robertklep 在评论中指出的那样,不需要在 getPromisedDistinct 中包含 then block ,因为它是不必要的困惑(请参阅 promise anti-patterns 。您已经返回带有 return $log.distinct... 的 Promise 对象,然后在 agg 函数中访问该值。

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

Mongoose tests with ES6 native promises, bluebird, and q. Any promise library that exports an ES6-style promise constructor should work in theory, but theory often differs from practice. If you find a bug, open an issue on GitHub

关于node.js - Mongoose 与 promise 截然不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35042063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com