不要等待所有的承诺来解决

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

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

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); }); 

我想应用这个function,所以我试图使它“denodeify兼容”。 但它不能按预期工作。 任何帮助将不胜感激

问题是, denodeify期待您的callback被称为标准的方式,即callback(err, data)

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

为了解决这个问题,你应该修改你的addFood函数来调用像这样的callbackcb(undefined, data.id);

ps:如果你想得到关于这个callback风格的更多详细信息,你可以查找“node style callback”