使用 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) => /* Do something */ );
太好了,我还遇到了另一件事来测试它。如果我需要在 fillArray 函数的其他部分代码中返回错误怎么办?例如,如果我需要在 q.all 之前执行 deferred.reject(err)
...
@mdlapla 如果asyncFunction
返回的承诺中至少有一个被拒绝,则fillArray
返回的承诺也被拒绝。我不明白您为什么会从 fillArray
函数显式返回错误。如果您更改了fillArray
代码,请发布一个新问题来描述您的问题,如果这回答了您原来的问题,请接受它作为正确答案。
@mdlapla 您可以将promise.all
或promise.allSettled
与promise.spread
结合使用以使其更容易。 github.com/kriskowal/q/wiki/…【参考方案2】:
我这样做了
fillArray().then(function(result)
console.log(result);
);
它工作正常。
我从你的代码中做的唯一一件事就是改变
var resultsArray = [];
【讨论】:
当fillArray
返回的promise被解析时,不能保证数组会被完全填充。以上是关于使用 Q 用异步调用填充数组的主要内容,如果未能解决你的问题,请参考以下文章
NodeJS - 使用 Q 对对象数组执行异步操作,有点扭曲