几种处理JavaScript异步操作的办法( 二 )


af.next()
}, 500)
}
function fn3 () {
console.log('Function 3')
}
function* asyncFunArr (...fn) {
fn[0]()
yield fn[1]()
fn[2]()
}
const af = asyncFunArr(fn1, fn2, fn3)
af.next()
// output =>
// Function 1
// Function 2
// Function 3
在这个例子中 , generator函数asyncFunArr()接受一个待执行函数列表fn , 异步函数将会通过yield来执行 。在异步函数内 , 通过af.next()激活generator函数的下一步操作 。
这么粗略的看起来 , 其实和发布/订阅模式非常相似 , 都是通过在异步函数内部主动调用方法 , 告诉订阅者去执行下一步操作 。但是这种方式还是不够优雅 , 比如说如果有多个异步函数 , 那么这个generator函数肯定得改写 , 而且在语义化的程度来说也有一点不太直观 。
5. 优雅的async/await
使用最新版本的Node已经可以原生支持async/await写法了 , 通过各种pollyfill也能在旧的浏览器使用 。那么为什么说async/await方法是最优雅的呢?且看代码:
function fn1 () {
console.log('Function 1')
}
function fn2 () {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Function 2')
resolve()
}, 500)
})
}
function fn3 () {
console.log('Function 3')
}
async function asyncFunArr () {
fn1()
await fn2()
fn3()
}
asyncFunArr()
// output =>
// Function 1
// Function 2
// Function 3
有没有发现 , 在定义异步函数fn2的时候 , 其内容和前文使用Promise的时候一模一样?再看执行函数asyncFunArr() , 其执行的方式和使用generator的时候也非常类似 。
异步的操作都返回Promise , 需要顺序执行时只需要await相应的函数即可 , 这种方式在语义化方面非常友好 , 对于代码的维护也很简单——只需要返回Promise并await它就好 , 无需像generator那般需要自己去维护内部yield的执行 。

【几种处理JavaScript异步操作的办法】


推荐阅读