异步迭代生成器
大家好!我是前端爬楼工程师🚹,一个野生程序员。好奇新技术,仰慕牛大佬。如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~
处理异步请求
以前我们的异步代码是通过回调函数来解决的。代码如下:
function foo(x , y , cb){
ajax(.., cb)
}
foo(11, 31, function(err, text){
if(err){
console.error(err)
}else{
console.log(text)
}
})
现在我们通过生成器来改写这个异步代码
function foo(x, y){
ajax(.., function (err, text){
if(err){
it.throw(err)
}else{
it.next(text)
}
})
}
function *main(){
try{
var text = yield foo(11,31)
console.log(text)
}catch(err){
console.error(err)
}
}
var it = main()
it.next() // 启动
随着it.next()
启动, 遇到yield
本身暂停的代码执行起来,foo
开始调用,此时yield
等待接收返回值,如果it.next(text)
传入text
. yield
接收到返回值text
, 赋值给text
变量,最后打印出来。如果抛的异常it.throw(err)
,最后被catch
接收打印错误。
所以生成器内部完全可以运行异步代码,而且可以同步错误处理。
错误处理
上面是外接将错误抛入生成器中,下面看看生成器向外抛出异常的情况
function *main(){
var s = yield "HELLO"
yield s.toLowerCase()
}
var it = main()
it.next().value // HELLO yield传出HELLO
it.next() // TypeError next()传入undefined
第二个it.next()
传入undefined
,第一个yield
返回值是undefined
,赋值给s
, 执行s.toLowerCase()
报错。
如果我们第二个it.next("HELLO")
,那么yield
返回给我们的是{value:'hello', done:false}
生成器和Promise
function foo (){
return request(..)
}
function *main(){
try{
var res = yield foo()
console.log(res)
}catch(er){
console.error(er)
}
}
var it = main()
var p = it.next().value
p.then(res=>{
it.next(res)
}, err=> {
it.throw(err)
})
ES7的async await替代
生成器和Promise结合就是async和await
function foo (){
return request(..)
}
async function main(){
try{
var res = await yield foo()
console.log(res)
}catch(er){
console.error(er)
}
}
main()
async await 比生成器更加简单的实现了异步编程的方式。
到此异步迭代生成器就结束了。
转载自:https://juejin.cn/post/7131337199504588831