Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不要等到所有的承诺都解决了_Javascript_Node.js_Promise - Fatal编程技术网

Javascript 不要等到所有的承诺都解决了

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.

我需要并行地获取数据,然后使用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兼容”。 但它并没有像预期的那样起作用。
任何帮助都将不胜感激

问题在于
去定义
希望您的回调能够以标准方式调用,即
回调(err,data)

但是您使用
回调(数据)
调用您的回调,因此它将您的承诺置于拒绝状态,因为它认为您的数据实际上是错误,因此
承诺。所有
都失败

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


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

您所说的失败是什么意思?它是否给出任何错误?听起来像是一个
addFood
超时,抛出了一个错误并导致
Promise
拒绝。这将导致
Promise.all
立即拒绝(
Promise.all
拒绝任何拒绝承诺的承诺)。我的意思是其他承诺被拒绝,即使它们没有完成运行。如果其中一个承诺失败,Promise.all将失败
.catch(函数(err){console.error(err);})这样做,看看发生了什么事情很好!谢谢