【问题标题】:Promise.all do not wait all promises to resolvePromise.all 不要等待所有的 Promise 解决
【发布时间】:2018-01-17 00:22:22
【问题描述】:

我需要并行获取数据,然后使用 Node.js 与它们同时计算。

所以我使用了 promise.all,但它的行为很奇怪。当我第一次启动它时,计算时间更长,并且在第一个承诺解决后它就失败了,即使其他承诺成功。 当我第二次启动它时,它更快,因为所有数据都存储在数据库中,所以它成功了。 我真的不明白。这是我的代码:

var Promise = require('promise');
/* The list of objects */
var ingrd_list = JSON.parse(req.body.ingrd_list);
/* func.addFood is my function to apply on. It takes a callback parameter as last parameter */
var pAddFood = Promise.denodeify(func.addFood);
var pArray = [];

ingrd_list.forEach(function(ingrd){
    var my_p = pAddFood(ingrd);
    pArray.push(my_p);
    });

Promise.all(pArray).then(function(){
    console.log("success !");
    })
    .catch(function(){
            console.log("failure !");
    });

我在另一个文件中定义了 addFood 函数,如下所示:

exports.addFood = function(ingrd, cb){
        /* Some code */
    cb(data.id);
});

我想应用这个功能,所以我试着让它“denodeify-compatible”。 但它没有按预期工作。 任何帮助将不胜感激

【问题讨论】:

  • 失败是什么意思?它有任何错误吗?
  • 这听起来像是addFood 之一超时,抛出错误并导致Promise 拒绝。这将导致Promise.all 立即拒绝(Promise.all 拒绝任何承诺拒绝)。
  • 我的意思是其他的承诺都被拒绝了,即使他们没有完成运行。
  • 如果其中一个承诺失败,Promise.all 将失败
  • .catch(function(err){ console.error(err); }); 这样做看看会发生什么

标签: javascript node.js promise


【解决方案1】:

问题是denodeify 期望您的回调以标准方式调用,即callback(err, data)

但是你用callback(data) 调用你的回调,所以它把你的承诺置于拒绝状态,因为它认为你的数据实际上是错误,因此Promise.all 失败

要解决这个问题,您应该修改您的 addFood 函数以像这样调用回调 cb(undefined, data.id);

ps:如果您想了解有关此回调样式的更多详细信息,可以查找“节点样式回调”

【讨论】:

  • 效果很好!谢谢!
猜你喜欢
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 2017-09-10
  • 2021-03-22
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
相关资源
最近更新 更多