我很困惑为什么 Bluebird 的 Promise.promisify 没有 promise 我的查询函数,因为它像大多数节点样式函数一样需要回调。难道是 Mongoose 的 Aggregation() 方法破坏了代码?
function query(callback) {
model.aggregate([{$sort:{a: -1}}], function(err, items) {
if (err) {
console.log(err);
}
let mostA = items[0].a;
Caller.aggregate([{$sort:{b: -1}}], function(err, items) {
if (err) {
console.log(err);
}
let mostB = items[0].b;
callback({mostA: mostA, mostB: mostB});
});
});
};
let most = Promise.promisify(query);
most()
.then((data) => {
// do something
})
.catch((err) => {
console.log('err:', err); // I always get an error.
});
最佳答案
这不是节点样式回调。节点样式回调必须执行以下操作:
- 回调必须是该方法的最后一个参数(您很擅长这个)。
- 回调必须有两个参数(你不擅长这个)
- 回调的第一个参数必须是一个错误值,只要有错误,该值就为真(你不擅长这个)。
- 回调的第二个参数必须是返回的数据(如果有)。
此外,您的 query()
函数没有进行正确的错误处理。它需要以错误值作为第一个参数调用回调,然后停止进一步处理。
所以,当你这样做时:
callback({mostA: mostA, mostB: mostB});
您告诉回调存在错误,因为您将第一个参数作为真值传递。
如果你想使其成为正确的形式,你可以这样做:
callback(null, {mostA: mostA, mostB: mostB});
关于javascript - Bluebird promisify 不包装节点样式函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37287032/