Javascript Bluebird promisify不包装节点样式函数

Javascript Bluebird promisify不包装节点样式函数,javascript,mongodb,mongoose,promise,bluebird,Javascript,Mongodb,Mongoose,Promise,Bluebird,为什么Bluebird的Promise.promisify没有承诺我的查询函数,因为它像大多数节点样式的函数一样需要回调,这让我很困惑。是Mongoose的aggregation()方法破坏了代码吗 function query(callback) { model.aggregate([{$sort:{a: -1}}], function(err, items) { if (err) { console.log(err); } let mostA = it

为什么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.
});

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

  • 回调必须是该方法的最后一个参数(您在这方面做得很好)
  • 回调必须有两个参数(您在这方面做得不好)
  • 回调函数的第一个参数必须是一个错误值,无论何时出现错误(您在这方面做得不好),该值都是真实的
  • 回调的第二个参数必须是返回的任何数据(如果有)
  • 此外,您的
    query()
    函数没有进行正确的错误处理。它需要以错误值作为第一个参数调用回调,然后停止进一步的处理

    因此,当您这样做时:

    callback({mostA: mostA, mostB: mostB});
    
    您告诉回调存在错误,因为您将第一个参数作为真实值传递

    如果要使其成为正确的形式,请执行以下操作:

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

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

  • 回调必须是该方法的最后一个参数(您在这方面做得很好)
  • 回调必须有两个参数(您在这方面做得不好)
  • 回调函数的第一个参数必须是一个错误值,无论何时出现错误(您在这方面做得不好),该值都是真实的
  • 回调的第二个参数必须是返回的任何数据(如果有)
  • 此外,您的
    query()
    函数没有进行正确的错误处理。它需要以错误值作为第一个参数调用回调,然后停止进一步的处理

    因此,当您这样做时:

    callback({mostA: mostA, mostB: mostB});
    
    您告诉回调存在错误,因为您将第一个参数作为真实值传递

    如果要使其成为正确的形式,请执行以下操作:

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

    这不是节点式回调???如果你自己编写这个函数,你应该推荐那些
    aggregate
    方法。是的,
    model.aggregate()
    是需要推荐的,而不是
    query()
    。这不是节点式回调???如果你自己编写这个函数,你应该推荐那些
    aggregate
    方法。是的,
    model.aggregate()
    是需要推荐的,而不是
    query()
    @MichaelL-这回答了你的问题吗?如果是这样,请单击答案左侧的绿色复选标记,向社区表明这一点,并为自己赢得一些声誉点,因为在堆栈溢出问题上遵循了正确的过程。如果没有,请解释你的问题的哪一部分你仍然感到困惑。@MichaelL-这回答了你的问题吗?如果是这样,请单击答案左侧的绿色复选标记,向社区表明这一点,并为自己赢得一些声誉点,因为在堆栈溢出问题上遵循了正确的过程。如果没有,请解释你的问题的哪一部分你仍然感到困惑。