使用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。 迭代器返回的最终值是否相关,完全取决于你如何使用它。