javascript - Promise.all 不要等待所有的 promise 来解决

标签 javascript node.js promise

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

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

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”。 但它没有按预期工作。 任何帮助将不胜感激

最佳答案

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

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

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

ps:如果想更详细了解这种回调方式,可以找“node style callback”

关于javascript - Promise.all 不要等待所有的 promise 来解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38382987/

相关文章:

javascript - 等到所有 promise 都在 JavaScript 中解决

javascript - 使用javascript的磁性光标移动

node.js - 如何将 Angular 2 应用程序与 .net core 连接

node.js - Mongoose 将架构属性更改应用于文档

javascript - 使用 Node.js 生成文件夹和该文件夹中的文件

javascript - Node.js 第一次使用 promise 不更改数据

javascript - promise 回调返回 promise

javascript - 使用 ng-template 进行 ng-select 时,清除图标 'x' 丢失

javascript - 如何在 jQuery 上通过鼠标移动来放大和缩小屏幕的一部分?

javascript - 如何使用 JSON 中的选项构建 optgroup?