生成器返回值的语义

时间:2017-11-19 17:52:03

标签: javascript typescript

我在理解" return"的语义时遇到了问题。在发电机中。我把它理解为最后的,因此最后的价值。

function* gen() {
  yield "foo";
  return "bar";
}

for (const x of gen()) {
  console.log(x);
}

此示例仅打印" foo"而不是" bar"。

编辑:

有没有办法获得" done = true"的返回值?使用" for"的迭代器语法,还是总是丢失?

3 个答案:

答案 0 :(得分:1)

不,您无法从for … of循环获取返回值。不过你可以试试

function* gen() {
  yield 1;
  yield 2;
  return "done";
}
function* genAndLogResult() {
  const val = yield* gen();
  console.log(val);
}

for (const x of genAndLogResult()) {
  console.log(x + 40);
}

答案 1 :(得分:0)

来自:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function%2A

  

生成器中的return语句在执行时将使生成器完成。如果返回一个值,它将作为值传回。已返回的生成器不会再生成任何值。

for循环跳过“完成”步骤是有道理的。例如:

function* gen() { yield "foo" }
const inst = gen()
inst.next() // { done: false, value: "foo" }
inst.next() // { done: true, value: undefined }

function* gen() { yield "foo"; return "bar" }
const inst = gen()
inst.next() // { done: false, value: "foo" }
inst.next() // { done: true, value: "bar" }

由于生成器不一定具有return语句,因此您不希望for循环的最后一次迭代始终必须处理最终的undefined值。

答案 2 :(得分:0)

yield关键字用于暂停和恢复生成器功能。

function* gen() {
    yield "foo";
    yield "bar";
}

for (const x of gen()) {
    console.log(x);
}

它会打印foobar。如果您需要有关yield点击here

的更多详情