usage of async

继发执行

首先需要注意一点,只有在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)
})()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容