Generator.prototype.return

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 方法。


参考书籍: