繼發(fā)執(zhí)行
首先需要注意一點(diǎn),只有在async函數(shù)中使用await才會(huì)繼發(fā)執(zhí)行,外部不受影響
// 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實(shí)現(xiàn)繼發(fā)操作,但是無(wú)法得到正確的結(jié)果,因?yàn)閍sync函數(shù)外部是不受影響的,其實(shí)foo,bar,baz三個(gè)函數(shù)是同步執(zhí)行的,其實(shí)只要看一下forEach的實(shí)現(xiàn)就知道
const forEach = (arr, callback) => {
for(let i = 0; i < arr.length; i++) {
callback(arr[i], i)
}
}
所以callback執(zhí)行后直接返回,如果要讓forEach支持async callback,就需要這樣
const forEach = async (arr, callback) => {
for (let i = 0; i < arr.length; i++) {
await callback(arr[i], i)
}
}
但是更實(shí)用的方法是在需要繼發(fā)的場(chǎng)景直接實(shí)用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()
}
并發(fā)執(zhí)行
如果異步操作都是繼發(fā)的太過(guò)浪費(fèi),所以盡量使用并發(fā)
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)
})()