学习内容引自阮一峰老师的《ES6标准入门》,第16章的第5节Generator.prototype.return()。
--------------------------------------------------分割符(学习笔记)-----------------------------------------
笔记一
Generator函数返回的遍历器对象的return方法,和在Generator函数内部定义的return语句是等价的,即
function *generator() {
yield 1;
}
let gen = generator();
gen.next();//{value:1,done:false}
gen.return(2);//{value:2,done:false}
等价于
function *generator() {
yield 1;
return 2;
}
let gen = generator();
gen.next();//{value:1,done:false}
gen.next();//{value:2,done:false}
笔记二
原文:如果Generator函数内部有try...finally代码块,那么return方法会推迟到finally代码块执行完在执行。
修正:如果Generator函数内部有try...finally代码块,同时next()方法已进入try代码块,那么return方法会推迟到finally代码块执行完在执行;否则直接执行return方法。
//原文代码
function* numbers () {
yield 1;
try {
yield 2;
yield 3;
} finally {
yield 4;
yield 5;
}
yield 6;
}
var g = numbers();
g.next() // { value: 1, done: false }
g.next() // { value: 2, done: false }
g.return(7) // { value: 4, done: false }
g.next() // { value: 5, done: false }
g.next() // { value: 7, done: true }
验证代码如下:
function *numbers() {
yield 1;
try{
yield 2;
yield 3;
}finally {
yield 4;
yield 5;
}
yield 6;
}
let g = numbers();
g.next();//{ value: 1, done: false }
//去掉这一行代码,则未进入try语句块,所以后面是直接执行return(7)方法。
//console.log(g.next());
g.return(7);//{ value: 7, done: true }
g.next();//{ value: undefined, done: true }
g.next();//{ value: undefined, done: true }