我需要并行获取数据,然后使用 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/