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

Posted

技术标签:

【中文标题】使用 Q 用异步调用填充数组【英文标题】:Filling an array with asynchronous calls using Q 【发布时间】:2019-04-30 06:13:36 【问题描述】:

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

我一直在研究这个例子(这不是预期的,因为数组是在填充之前返回的)。

function fillArray()
 var deferred = q.defer();

 var resultsArray;
 for(var i=0; i < numberOfElements; i++)
  asyncFunction(i).then(function(result)
   resultsArray.push(result);
  
 

 deferred.resolve(resultsArray);
 return deferred.promise;


function asyncFunction(number)
 var deferred = q.defer();
 deferred.resolve(number+1);
 return deferred.promise;

我读到我可以使用 Q.all 调用几个函数,但我不明白如何在循环内调用它。

感谢您的帮助。

【问题讨论】:

你不要把它称为 in 循环。你在循环中创建一个 promise 数组,然后在上面应用 Q.all 【参考方案1】:

试试这个:

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;

promise.all() 被拒绝,拒绝原因与第一个被拒绝的承诺相同。这意味着如果数组中的某些 Promise 被拒绝,all 返回的 Promise 也会被拒绝。如果您想等待所有原始承诺都被解决,您可以使用promise.allSettled()。

【讨论】:

谢谢,我还需要推迟 fillArray 吗?我需要做类似deferred.resolve(q.all(promises)); 的事情吗? q.all 已经返回了一个承诺。检查我的答案中的文档链接。由于fillArray 正在返回调用q.all 的结果,因此您只需“订阅”该承诺fillArray().then((resultsArray) =&gt; /* Do something */ ); 太好了,我还遇到了另一件事来测试它。如果我需要在 fillArray 函数的其他部分代码中返回错误怎么办?例如,如果我需要在 q.all 之前执行 deferred.reject(err)... @mdlapla 如果asyncFunction 返回的承诺中至少有一个被拒绝,则fillArray 返回的承诺也被拒绝。我不明白您为什么会从 fillArray 函数显式返回错误。如果您更改了fillArray 代码,请发布一个新问题来描述您的问题,如果这回答了您原来的问题,请接受它作为正确答案。 @mdlapla 您可以将promise.allpromise.allSettledpromise.spread 结合使用以使其更容易。 github.com/kriskowal/q/wiki/…【参考方案2】:

我这样做了

fillArray().then(function(result)
   console.log(result);
);

它工作正常。

我从你的代码中做的唯一一件事就是改变

var resultsArray = [];

【讨论】:

fillArray返回的promise被解析时,不能保证数组会被完全填充。

以上是关于使用 Q 用异步调用填充数组的主要内容,如果未能解决你的问题,请参考以下文章

如何让异步/等待等待我的嵌套数组填充

NodeJS - 使用 Q 对对象数组执行异步操作,有点扭曲

循环内的异步函数完成后如何调用函数?

从 Firestore 异步调用填充 RecyclerView

填充某些属性的javascript异步调用

使用 SwiftUI 时异步填充/预填充多个用户可变的“@State”值?