2017-10-20 108 views
1

我想這樣做在一個陣營組成如下:如何等待多個異步等待中的請求作出反應

const someArray = [/*stuff*/] 
const results = [] 
someArray.forEach(async item => { 

    const result = await someAsyncFunction(item) 
    results.push(result) 
}) 

我怎麼能知道什麼時候所有的結果都返回,然後做一些事情?

如果我是用$ Q,在AngularJS,我可以做

var results = [] 
someArray.forEach(function(item) { 
    var result = someAsyncFunctionThatReturnsAPromise(item); 
    results.push(result); 
}); 

$q.all(results).then(function() { 
    // do something 
}); 
+3

使用'Promise.all(/ *你的諾言陣列* /)。然後(...)'? – CRice

+0

你讓你的代碼同步,所以不是保證操作的順序?這意味着如果你在forEach循環之後放置'console.log(results)',它將包含所有的值。這是異步/等待的美妙之處。 –

+1

@ChaseDeAnda不幸的是,你不能使用forEach與異步/ await,但基本的循環將工作.. – Keith

回答

4

你會做同樣的事情,如果它不是一個陣營組成:

Promise.all(someArray.map(someAsyncFunction)).then(results => { 
    // do stuff with results 
}); 

中當然你也可以使用q,其中$q是基於。隨你便。

+0

謝謝。我結束了使用q庫。 – dfritch

0

除了來自菲利克斯答案,一個async函數裏,你也可以awaitPromise.all()的結果,所以:

const results = await Promise.all(someArray.map(someAsyncFunction));