学习内容引自阮一峰老师的《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 }