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

Filling an array with asynchronous calls using Q

我有一个函数 returns 使用 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 调用多个函数,但我不明白如何在循环中调用它。

感谢您的帮助。

试试这个:

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() is rejected with the same rejection reason as the first promise to be rejected. This means that if some of the promises in the array are rejected, the promise returned by all is also rejected. You can use promise.allSettled()如果你想等待所有的原始承诺都被结算。

我这样做了

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

它工作正常。

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

var resultsArray = [];