繼發執行
首先需要注意一點,只有在async函數中使用await才會繼發執行,外部不受影響
// code1
baz = bar = foo = async () => {
await new Promise(resolve => setTimeout(resolve, 500))
console.log(`foo resolved`)
}
[foo, bar, baz].forEach(async (item) => {
await item()
})
這段代碼的原意可能是利用forEach實現繼發操作,但是無法得到正確的結果,因為async函數外部是不受影響的,其實foo,bar,baz三個函數是同步執行的,其實只要看一下forEach的實現就知道
const forEach = (arr, callback) => {
for(let i = 0; i < arr.length; i++) {
callback(arr[i], i)
}
}
所以callback執行后直接返回,如果要讓forEach支持async callback,就需要這樣
const forEach = async (arr, callback) => {
for (let i = 0; i < arr.length; i++) {
await callback(arr[i], i)
}
}
但是更實用的方法是在需要繼發的場景直接實用for...of
,一開始的code1可以改寫成如下
// code2
baz = bar = foo = async () => {
await new Promise(resolve => setTimeout(resolve, 500))
console.log(`foo resolved`)
}
const list = [foo, bar, baz]
for ( let func of list) {
await func()
}
并發執行
如果異步操作都是繼發的太過浪費,所以盡量使用并發
const baz = bar = foo = async () => {
return await new Promise(resolve => setTimeout(() => resolve('helloworld'), 500))
}
const promiseList = [baz, bar, foo].map(async (item) => {
return await item()
})
;(async () => {
const [val1, val2, val3] = await Promise.all(promiseList)
console.log(val1, val2, val3)
})()