目錄
1.說明
2.示例
3.解決方案
1.說明
在foreach中調用異步方法,即使使用了await,不會依次執行每個異步任務,也就是說Array.prototype.forEach
不會等待 Promise 完成,即使你在回調函數中返回一個 Promise,forEach
也會繼續執行下一個元素,而不會等待前一個 Promise 解決(resolve)。 只是按照順序啟動了所有的異步任務
2.示例
function asyncAll() {let arrs = []arrs.push(5000)arrs.push(4000)arrs.push(3000)arrs.push(2000)arrs.push(1000)arrs.forEach(async (item) => {console.log('在執行結果之前,'+ item)const res = await async2(item)console.log(res)console.log('在執行結果之后,'+ item)})console.log("所有的都執行完成")
}
async2是一個異步方法,返回promise,執行結果如下:
在執行結果之前,5000
在執行結果之前,4000
在執行結果之前,3000
在執行結果之前,2000
在執行結果之前,1000
所有的都執行完成
1000
在執行結果之后,1000
2000
在執行結果之后,2000
3000
在執行結果之后,3000
4000
在執行結果之后,4000
5000
在執行結果之后,5000
按照順序啟動了任務,但實際卻是最后一個任務先執行完成,第一個任務最后執行完成;并且foreach中的任務沒有執行完成就執行了foreach后面的處理。
3.解決方案
①使用for of循環,異步任務會按照順序依次執行
②如果異步任務之間沒有明確的順序,可以使用promise all處理,循環將每個異步任務放在任務數組中,使用promise.all同時執行所有的異步任務,在then處理中可以獲取所有異步任務的結果,然后進行后續的處理,這樣可以確保異步任務和后續處理的順序