return
为迭代器的最后一次迭代提供返回值(当done
equals true
).
我稍微简化了您的示例,因为异步操作似乎与问题无关:
function *gen(){
const val = yield 4;
return val * 2;
}
var it = gen();
var val = it.next(); // { value: 4, done: false }
console.log(val.value); // 4
var res = it.next(val.value); // { value: 8, done: true }
console.log(res.value); // 8
而如果没有return
值,在最后一次迭代中,您将返回一个值undefined
:
function *gen2(){
const val = yield 4;
yield val * 2;
}
var it2 = gen2();
var val2 = it2.next(); // { value: 4, done: false }
console.log(val2.value); // 4
var res2 = it2.next(val2.value); // { value: 8, done: false }
console.log(res2.value); // 8
it2.next(); // { value: undefined, done: true }
边注:根据经验,总会有一个next
打电话然后有yield
语句,这就是第二个示例中还有一个 next 调用的原因。
假设您正在使用像这样的生成器运行器co https://github.com/tj/co,那么完成生成器后得到的值就是您的值return
:
co(function* () {
var result = yield Promise.resolve(true);
return result;
}).then(function (value) {
console.log(value); // value equals result
}, function (err) {
console.error(err.stack); // err equals result
});
重要的:如果您正在迭代迭代器,请使用for ... of
循环或类似的东西Array.from
, the return
value 将被忽略(由于您正在执行异步操作,因此情况可能并非如此):
function *gen(){
const val = yield 4;
return val * 2;
}
for (let value of gen()) {
console.log(value);
}
// 4
最后,调用生成器只是创建一个迭代器。迭代器返回的最终值是否相关,完全取决于您如何使用它。