Javascript 不要等到所有的承诺都解决了
我需要并行地获取数据,然后使用Node.js同时计算它们 所以我使用promise.all,但它的行为很奇怪。当我第一次启动它时,计算时间更长,并且在第一个承诺解决后它就失败了,即使其他承诺成功了。 当我第二次启动它时,速度更快,因为所有数据都存储在数据库中,所以它成功了。 我真的不明白。这是我的密码:Javascript 不要等到所有的承诺都解决了,javascript,node.js,promise,Javascript,Node.js,Promise,我需要并行地获取数据,然后使用Node.js同时计算它们 所以我使用promise.all,但它的行为很奇怪。当我第一次启动它时,计算时间更长,并且在第一个承诺解决后它就失败了,即使其他承诺成功了。 当我第二次启动它时,速度更快,因为所有数据都存储在数据库中,所以它成功了。 我真的不明白。这是我的密码: var Promise = require('promise'); /* The list of objects */ var ingrd_list = JSON.parse(req.body.
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兼容”。
但它并没有像预期的那样起作用。
任何帮助都将不胜感激问题在于
去定义
希望您的回调能够以标准方式调用,即回调(err,data)
但是您使用回调(数据)
调用您的回调,因此它将您的承诺置于拒绝状态,因为它认为您的数据实际上是错误,因此承诺。所有都失败
要解决这个问题,您应该修改addFood
函数,以便像这样调用回调cb(未定义,data.id)代码>
ps:如果您想了解有关此回调样式的详细信息,可以查找“节点样式回调”您所说的失败是什么意思?它是否给出任何错误?听起来像是一个addFood
超时,抛出了一个错误并导致Promise
拒绝。这将导致Promise.all
立即拒绝(Promise.all
拒绝任何拒绝承诺的承诺)。我的意思是其他承诺被拒绝,即使它们没有完成运行。如果其中一个承诺失败,Promise.all将失败.catch(函数(err){console.error(err);})代码>这样做,看看发生了什么事情很好!谢谢