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异步操作的办法】
推荐阅读
- 纯JavaScript实现的调用设备摄像头并拍照的功能
- 如何优雅的处理API接口的返回数据-----附源码
- 淘宝售后的问题与对策 淘宝卖家售后处理技巧
- 西装裤太长怎么救急 西装裤太长怎么处理
- 淘宝特价版售假处罚 淘宝特价版违规怎么处理
- 怎样消灭床上的跳蚤 床上被子上的跳蚤的怎么处理
- 做排骨汤买什么排骨好,排骨汤的排骨怎么处理
- 买一口价黄金被骗了报警能处理么 误买了一口价黄金怎么办
- 脚垫有异味,怎么处理 防滑垫有异味怎么处理
- win10操作系统和CPU处理器分32位和64位两种,它们的区别是什么