【问题标题】:ES6 yield (yield 1)(yield 2)(yield 3)()ES6 产量(产量 1)(产量 2)(产量 3)()
【发布时间】:2016-08-25 18:51:20
【问题描述】:
function* generatorFunction() {
  yield (yield 1)(yield 2)(yield 3)();
}
var iterator = generatorFunction();

// [1, 2, 3]
var iteratedOver = [iterator.next().value, iterator.next().value, iterator.next().value];

我不确定这是如何工作的。

yield 不返回函数引用,那么像(yield 2) 这样的括号语句是什么——它们是没有主体的胖箭头匿名函数吗?像这样使用部分应用程序如何调用它们?

我在这里遗漏了一些东西,有人可以解释一下吗?


更新:在 Chrome 50.0.2661.86、Safari 9.1 (50.0.2661.86)、Firefox 44.0.2 三种浏览器上试用,均无错误。

ESFiddle 也可以正常执行。

评论者报告 Babel 执行也没有错误。

问题来源来自http://tddbin.com/#?kata=es6/language/generator/send-function,第二个kata。

【问题讨论】:

  • 您的代码示例不适合我。 Uncaught TypeError: (intermediate value) is not a function
  • yield 返回您传递给.next(…) 的任何内容。你很幸运,你只调用了 2 次 .next(),下次它会抛出。
  • @Ben:是的,但它引出了一个问题......是什么让你相信这个代码首先是有效的?你在什么地方看到过吗?
  • @Ben:该链接在输出中产生错误。不过对 Safari 很感兴趣。
  • @Bergi 3 个调用,实际上,对应于三个“内部”yields

标签: javascript ecmascript-6 generator yield


【解决方案1】:

我不确定这是如何工作的。

嗯,是的,它不应该工作。它只是因为 Babel 中的错误而起作用。

yield 不返回函数引用,那么像(yield 2) 这样的括号语句是什么——它们是没有主体的胖箭头匿名函数吗?像这样使用部分应用程序如何调用它们?

不,它真的只是标准功能应用程序,没有魔法。 yield 可以返回一个函数引用,当它这样做时,这可能会起作用。如果没有,它将在第三次.next() 调用中抛出异常。

作为工作版本的示例:

function* generatorFunction() {
  yield (yield 1)(yield 2)(yield 3)();
}
var test = (a) => {
  console.log(a);
  return (b) => {
    console.log(b);
    return (c) => {
      console.log(c);
      return 4;
    };
  };
};
var iterator = generatorFunction();
iterator.next(); // {value: 1, done: false}
iterator.next(test); // {value: 2, done: false}
iterator.next("a"); // "a" {value: 3, done: false}
iterator.next("b"); // "b" undefined {value: 4, done: false}
iterator.next("d"); // {value: undefined, done: true}

那么这是如何工作的呢?那些嵌套/链接的yield 语句最好写成

function* generatorFunction() {
  let fn1 = yield 1;
  let a = yield 2;
  let fn2 = fn1(a);
  let b = yield 3;
  let fn3 = fn2(b);
  let res = fn3();
  let d = yield res;
  return undefined;
}

评论者报告 Babel 执行也没有错误。

那是因为一个 babel 错误。如果你检查transpiler output,它实际上的行为就像

function* generatorFunction() {
  let fn1 = yield 1;
  let a = yield 2;
  let b = yield 3;
  // these are no more executed with only 3 `next` calls
  let fn2 = fn1(a);
  let fn3 = fn2(b);
  let res = fn3();
  let d = yield res;
  return undefined;
}

【讨论】:

  • 有人想报告这个错误吗?
  • 归档于regeneratorBabel。感谢您跟踪。
猜你喜欢
  • 2013-06-24
  • 2016-06-08
  • 2015-11-14
  • 2018-02-04
  • 2014-03-02
  • 2021-03-16
  • 2013-09-26
  • 2023-03-21
  • 2022-10-01
相关资源
最近更新 更多