usage of async

繼發(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)
})()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容