Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 使用Q使用异步调用填充数组_Javascript_Arrays_Node.js_Promise_Q - Fatal编程技术网

Javascript 使用Q使用异步调用填充数组

Javascript 使用Q使用异步调用填充数组,javascript,arrays,node.js,promise,q,Javascript,Arrays,Node.js,Promise,Q,我有一个使用Q库异步返回值的函数。 我必须在循环中调用它,用所有结果填充数组 类似于我一直在处理的这个示例(这不是预期的效果,因为数组是在填充之前返回的) 函数fillArray(){ var deferred=q.deferred(); var结果数组; 对于(var i=0;i

我有一个使用Q库异步返回值的函数。 我必须在循环中调用它,用所有结果填充数组

类似于我一直在处理的这个示例(这不是预期的效果,因为数组是在填充之前返回的)

函数fillArray(){
var deferred=q.deferred();
var结果数组;
对于(var i=0;i
我已经读过,我可以使用Q.all调用几个函数,但我不知道如何在循环中调用它

谢谢你的帮助。

试试这个:

function fillArray(){
    var promises = [];

    for(var i = 0; i < numberOfElements; i++){
        promises.push(asyncFunction(i));
    }

    return q.all(promises);
}

function asyncFunction(number){
    var deferred = q.defer();
    deferred.resolve(number+1);
    return deferred.promise;
}
函数fillArray(){
var承诺=[];
对于(var i=0;i
被拒绝的原因与要拒绝的第一个承诺相同。这意味着如果数组中的某些承诺被拒绝,则
all
返回的承诺也会被拒绝。如果要等待解决所有原始承诺,可以使用此选项。

尝试以下操作:

function fillArray(){
    var promises = [];

    for(var i = 0; i < numberOfElements; i++){
        promises.push(asyncFunction(i));
    }

    return q.all(promises);
}

function asyncFunction(number){
    var deferred = q.defer();
    deferred.resolve(number+1);
    return deferred.promise;
}
函数fillArray(){
var承诺=[];
对于(var i=0;i
被拒绝的原因与要拒绝的第一个承诺相同。这意味着,如果数组中的某些承诺被拒绝,则
all
返回的承诺也会被拒绝。如果要等待所有原始承诺得到解决,则可以使用。

我这样做了

fillArray().then(function(result){
   console.log(result);
});
它工作正常

我从你的代码中做的唯一额外的事情就是更改

var resultsArray = [];
是我干的

fillArray().then(function(result){
   console.log(result);
});
它工作正常

我从你的代码中做的唯一额外的事情就是更改

var resultsArray = [];

你不在循环中调用它。你在循环中创建一个承诺数组,然后对其应用
Q.all
。你不在循环中调用它。你在循环中创建一个承诺数组,然后对其应用
Q.all
。谢谢,我也需要延迟fillArray吗?我需要做类似
deferred.resolve(Q.all(promissions))的事情吗
q.all
已经返回了一个承诺。请检查我答案中指向文档的链接。因为
fillArray
正在返回调用
q.all
的结果。您只需“订阅”该承诺
fillArray()
太好了,我在测试这一点时又遇到了一件事。如果我需要在fillArray函数的代码的其他部分返回一个错误怎么办?例如,如果我需要执行一个
延迟。拒绝(err)
在q.all…@mdlapla之前如果
asyncFunction
返回的承诺中至少有一个被拒绝,那么
fillArray
返回的承诺也会被拒绝。我不明白为什么您会显式地从
fillArray
函数返回错误。如果
fillArray
代码更改,请发布新的问题n描述您的问题,如果这回答了您的原始问题,请将其视为正确答案。@mdlapla您可以使用
promise.all
promise.allselled
promise.spread
结合使用,以使其更简单。谢谢,我是否也需要延迟fillArray?我是否需要执行类似
deferred的操作。解析(q.all(promises));
q.all
已经返回了一个承诺。检查我答案中指向文档的链接。因为
fillArray
正在返回调用
q的结果。所有
你需要做的就是“订阅”该承诺
fillArray()。然后((resultArray)=>{/*做点什么*/})
太好了,我在测试这一点时又遇到了一件事。如果我需要在fillArray函数的代码的其他部分返回一个错误怎么办?例如,如果我需要执行一个
延迟。拒绝(err)
在q.all…@mdlapla之前如果
asyncFunction
返回的承诺中至少有一个被拒绝,那么
fillArray
返回的承诺也会被拒绝。我不明白为什么您会显式地从
fillArray
函数返回错误。如果
fillArray
代码更改,请发布新的问题n描述您的问题,如果这回答了您的原始问题,请将其视为正确答案。@mdlapla您可以使用
promise.all
promise.allsolved
promise.spread
组合使用,以使其更简单。无法保证当promises返回b时数组将完全填充y
fillArray
已解析。无法保证在解析
fillArray
返回的承诺时数组将完全填充。