Bluebird承诺不包装节点样式功能

时间:2016-05-17 22:08:46

标签: javascript mongodb mongoose promise bluebird

我很难理解为什么Bluebird的Promise.promisify没有宣传我的查询功能,因为它像大多数节点样式函数一样需要回调。可能是Mongoose的aggregate()方法破坏了代码吗?

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 个答案:

答案 0 :(得分:2)

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

  1. 回调必须是该方法的最后一个参数(你对该方法很好)。
  2. 回调必须有两个参数(你对此不好)
  3. 回调的第一个参数必须是一个错误值,只要出现错误就是真正的(你对此不好)。
  4. 回调的第二个参数必须是返回的数据(如果有的话)。
  5. 此外,您的query()函数无法正确处理错误。它需要以错误值作为第一个参数调用回调,然后停止进一步处理。

    所以,当你这样做时:

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

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

    如果你想使它成为正确的形式,你会这样做:

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