Generator
Posted panjingshuang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Generator相关的知识,希望对你有一定的参考价值。
Generator是一个异步编程的解决方案。
基本写法:
function* gen(){
//code yield 1;//暂停执行
console.log(this)//生成器函数不能作为构造函数,并且他返回的也不是this对象,同时其函数内部的this可能是window
*yield [1,2,3] //1 2 3 返回一个遍历器对象,直接将对象给遍历出来,可以用在获取嵌套函数,只能是在生成器函数中使用,普通函数中会报错
var result = yield 2;
return "2"; 最后一次的执行结束结果: {value:"2“,done:true}
}
var gen = gen();//这里还未开始执行代码,只是返回了遍历器对象
gen.next()//开始向后执行,遇到一个最新的yield停止执行,恢复执行 返回结果 {value:1,done:false}
//其中value是 yield返回的值,done表示是否执行结束,false表示未结束,true表示结束。
gen.next("a") //这个参数就是传递给result的 也就是说 var result = "a"
gen.throw("a")// 在外部抛出了异常但是 捕获异常是在函数内部,也就是throw在函数外部,catch在函数内部,但是只捕获一次 如果内部没有异常捕获机制,就会被外部捕获,还会附带执行下一条gen.next()
gen.throw("b")//在函数外部被捕获,由于生成器函数只捕获一次异常
gen.return(”555“)//返回给定的值,并终结函数遍历 {value:"555",done:true}
特点:
1.function 后面加了一个* ,表示generator函数
2.函数中使用yield暂停标志
3.yield表达式在另一个表达式中的时候要使用括号,console.log("heo"+(yield 3));
4.yield表达式放在赋值表达式后面不必加括号 ,var result = yield 3;
Generator的异步函数应用:
使用生成器来进行异步操作的缺点是需要自己一个一个next,也就是手动的执行,但是可以通过使用封装函数Thunk(Thunkify)来实现,自动的Next
以及使用co模块来实现自动执行