Generator 函数返回的遍历器对象,还有一个 return
方法,可以返回给定的值,并且终结遍历 Generator 函数。
function* gen() {yield 1;yield 2;yield 3;}const generator = gen();generator.next() // { value: 1, done: false }generator.return('foo') // { value: "foo", done: true }generator.next() // { value: undefined, done: true }
上面代码中,遍历器对象 generator
调用 return
方法后,返回值的 value
属性就是 return
方法的参数 foo
。并且,Generator 函数的遍历就终止了,返回值的 done
属性为 true
,以后再调用 next
方法,done
属性总是返回 true
。
如果 return
方法调用时,不提供参数,则返回值的 value
属性为 undefined
。
function* gen() {yield 1;yield 2;yield 3;}var generator = gen();generator.next() // { value: 1, done: false }generator.return() // { value: undefined, done: true }
如果 Generator 函数内部有 try...finally
代码块,且正在执行 try
代码块,那么 return
方法会推迟到 finally
代码块执行完再执行。
function* numbers () {yield 1;try {yield 2;yield 3;} finally {yield 4;yield 5;}yield 6;}var generator = numbers();generator.next() // { value: 1, done: false }generator.next() // { value: 2, done: false }generator.return(7) // { value: 4, done: false }generator.next() // { value: 5, done: false }generator.next() // { value: 7, done: true }
上面代码中,调用 return
方法后,就开始执行 finally
代码块,然后等到 finally
代码块执行完,再执行 return
方法。
参考书籍: