继发执行
首先需要注意一点,只有在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)
})()