使用ES6生成器函数返回
我很难找出如果使用return语句而不是yield来发生什么情况。
function *gen(){ const val = yield someAsyncFn(); assert.equal(val,4); return val; }
回报如何performance与收益不同? 我假设返回行为是一个正常的返回语句,但生成器函数的上下文,它也叫gen.return()
以及? 有点混乱。
也许以上只是相同的呢?
function *gen(){ const val = yield someAsyncFn(); assert.equal(val,4); yield val; }
return
为迭代器上次迭代传递一个返回值(当done
等于true
)。
我已经简化了一下你的例子,因为asynchronous操作似乎与这个问题没有关系:
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
语句,这就是为什么在第二个例子中还有一个下一个调用。
假设你正在使用一个像co
这样的generator-runner,那么你在完成generator之后得到的值就是你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
东西, return
值将被忽略(因为你正在做asynchronous操作,这可能不是这种情况):
function *gen(){ const val = yield 4; return val * 2; } for (let value of gen()) { console.log(value); } // 4
最后,调用一个生成器只是创build一个interator。 迭代器返回的最终值是否相关,完全取决于你如何使用它。