JavaScript Guidebook

JavaScript 完全知识体系

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


参考书籍: