generator 使用注意事项
记录下使用generator的注意点
1 generator使用this如何处理
function * gen(){
yield this.ajaxPost();
yield this.ajaxGet();
return something
}
es6 普通函数,使用严格模式,this为undefined
所有generator函数的执行是返回遍历器对象(iterator),
使用如下方式绑定外围this
let g_iterator = gen.call(this) // this为外围this
2 yield参与运算
yield语句如果参与运算,必须用括号括起来,并且是右侧表达式的结果参与运算
console.log(3 + yield 4); // 语法错误
console.log(3 + (yield 4)); // 打印7
3 next方法可以有参数
一句话说,next方法参数的作用,是为上一个yield语句赋值。由于yield永远返回undefined,如果有了next方法的参数,上一次的yield赋值变量就被赋了值。比如下例,原本a变量的值是undefined,但是有了next的参数,a变量现在等于next的参数,也就是9。
function* g() {
var o = 1;
var a = yield o++; // yield右侧表达式的值为执行next时返回的{value:此处 的值}
console.log('a = ' + a);
var b = yield o++;
}
var gen = g();
console.log(gen.next());
console.log(gen.next(9));
4 Generator.prototype.return()
该方法,可以返回给定的值,并且终结遍历Generator函数
function* gen() {
yield 1;
yield 2;
yield 3;
return 666
}
var g = gen();
console.log(g.next()); // { value: 1, done: false }
console.log(g.return('foo')); // { value: "foo", done: true } 上面定义的 return 666 就不起作用了
console.log(g.next()); // {value: undefined, done: true}