return
语句为迭代器的最后一个迭代(当done
等于true
时)提供返回值。
由于异步操作似乎与问题无关,因此我对您的示例进行了简化:
function *gen(){
const val = yield 4;
return val * 2;
}
var it = gen();
var val = it.next();
console.log(val.value);
var res = it.next(val.value);
console.log(res.value);
如果没有 return
值,最后一次循环将返回一个 undefined
值:
function *gen2(){
const val = yield 4;
yield val * 2;
}
var it2 = gen2();
var val2 = it2.next();
console.log(val2.value);
var res2 = it2.next(val2.value);
console.log(res2.value);
it2.next();
请注意:一般来说,
next
方法的调用次数总是比
yield
语句的数量多一个,这也是为什么第二个示例中会多调用一次 next 方法。
假设你正在使用像co
这样的生成器运行器,那么当生成器完成时,你得到的值将是你所return
的值:
co(function* () {
var result = yield Promise.resolve(true);
return result;
}).then(function (value) {
console.log(value);
}, function (err) {
console.error(err.stack);
});
重要提示:如果您正在使用for ... of
循环或类似Array.from
的方法来遍历迭代器,那么return
语句将会被忽略(由于您正在进行异步操作,这可能无关紧要):
function *gen(){
const val = yield 4;
return val * 2;
}
for (let value of gen()) {
console.log(value);
}
最终,调用生成器只会创建一个迭代器。最后一个迭代器返回的值是否相关,完全取决于您如何使用它。
co
或类似的东西),那么一旦你的生成器完成运行,解析值将是你的return
的值。如果你手动使用next
运行它,你可以自由决定你对最后一次迭代的值做什么。如果你使用循环来运行它,return
值将被忽略。 - nilsreturn
语句总是终止函数调用,即使在生成器中也是如此。因此,在此之后不会执行任何其他语句(包括yield
)。 - nilsfor ... of
循环的最后一条提示。谢谢! - Slavik Meltser