javascript - Bluebird promisify 不包装节点样式函数

标签 javascript mongodb mongoose promise bluebird

我很困惑为什么 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.
});

最佳答案

这不是节点样式回调。节点样式回调必须执行以下操作:

  1. 回调必须是该方法的最后一个参数(您很擅长这个)。
  2. 回调必须有两个参数(你不擅长这个)
  3. 回调的第一个参数必须是一个错误值,只要有错误,该值就为真(你不擅长这个)。
  4. 回调的第二个参数必须是返回的数据(如果有)。

此外,您的 query() 函数没有进行正确的错误处理。它需要以错误值作为第一个参数调用回调,然后停止进一步处理。

所以,当你这样做时:

callback({mostA: mostA, mostB: mostB});

您告诉回调存在错误,因为您将第一个参数作为真值传递。

如果你想使其成为正确的形式,你可以这样做:

 callback(null, {mostA: mostA, mostB: mostB});

关于javascript - Bluebird promisify 不包装节点样式函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37287032/

相关文章:

javascript - Node js mongodb 中的异步/等待处理错误

javascript - 切换复选框组中的复选框

javascript - 如何在开槽元素中设置嵌套元素的样式?

node.js - 如何将 MERN Web 应用程序转换为桌面应用程序?

node.js - 使用node.js查询mongoDB的特定字段

node.js - Mongoose getter 和 setter 无法正常工作

javascript - 名为 `name` 的数组按行而不是单词打印字符。使用 for 循环

Javascript:从按钮调用对话框

ruby-on-rails - 连接被拒绝 - connect(2) 与 rake db :seed on Mongodb

mongodb - 将 HDFS 数据移动到 MongoDB