【问题标题】:Bluebird promisify not wrapping node style function蓝鸟承诺不包装节点样式功能
【发布时间】:2016-09-14 04:44:31
【问题描述】:

我很困惑为什么 Bluebird 的 Promise.promisify 没有承诺我的查询函数,因为它像大多数节点样式函数一样需要回调。会不会是 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.
});

【问题讨论】:

  • 这不是节点式回调???
  • 如果你自己写这个函数,你宁愿承诺那些aggregate方法。
  • 是的,model.aggregate() 是需要承诺的,而不是 query()

标签: javascript mongodb mongoose promise bluebird


【解决方案1】:

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

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

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

所以,当你这样做时:

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

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

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

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

【讨论】:

  • @MichaelL - 这回答了你的问题吗?如果是这样,请单击答案左侧的绿色复选标记以向社区表明这一点,并为自己在堆栈溢出时遵循正确的程序赢得一些声誉积分。如果不是,请说明您仍然对问题的哪一部分感到困惑。
猜你喜欢
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
相关资源
最近更新 更多