一直以为 es7 里面的 async 和 await 可以用来简化串行异步代码,而没有想到还能并行。说到底,这俩货不过是 promise 的语法糖,await 的作用只是串行解析 promise。通常我们这样写:
function asyncAwaitFn(str) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(str)
}, 1000);
})
}
const parallel = async () => { // 并行执行
console.time(‘parallel’)
const parallelOne = await asyncAwaitFn(‘1’);
const parallelTwo = await asyncAwaitFn(‘2’)
console.log(parallelOne) //1
console.log(parallelTwo) //2
console.timeEnd(‘parallel’) //2003.509033203125ms
}
parallel()
这是串行,显然最后的执行时间应该大于 2000ms。
但如果换一种写法:
function asyncAwaitFn(str) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(str)
}, 1000);
})
}
const parallel = async () => { // 并行执行
console.time(‘parallel’)
const parallelOne = asyncAwaitFn(‘1’);
const parallelTwo = asyncAwaitFn(‘2’)
console.log(await parallelOne) //1
console.log(await parallelTwo) //2
console.timeEnd(‘parallel’) //1001.87255859375ms
}
parallel()
最后执行时间只要 1000ms,显然是并行了。
不过严谨来说,这依然是 promise 本身的并行罢了。