发电机真的是侵入性的

时间:2013-06-12 16:35:56

标签: javascript generator ecmascript-harmony ecmascript-6

据我了解Javascript生成器的当前规范,您必须明确标记包含yield的函数。

我想知道这背后的理由是什么。

如果这是真的,它会迫使人们写:

let thirdfunc = function*() {
  let value = 5;
  let other = yield 6;
  return value;
};

let secondfunc = function*() {
  yield thirdfunc();
};

let firstfunc = function*() {
  yield secondfunc();
};

let gen = function*() {
  // some code
  // more code
  yield firstfunc();
  // and code
};

let it = gen();
while( !it.done() ) {
  it.next();
};

这意味着,生成器会像癌症一样在代码库中传播。 虽然最后,对开发人员来说只有让迭代器产生和处理才真的很有趣。

我会发现,更加实际,只需定义,我想要处理迭代。

let thirdfunc = function() {
  let value = 5;
  let other = yield 6; // Change 1: incorporate yield
  return value;
};

let secondfunc = function() {
  thirdfunc();
};

let firstfunc = function() {
  secondfunc();
};

let gen = function*() { // Change 2: at this level I want to deal with descendant yields
  // some code
  // more code
  firstfunc();
  // and code
};

// Change 3: Handle iterator
let it = gen();
while( !it.done() ) {
  it.next();
}

如果浏览器必须将yield调用和生成器处理程序(firstfuncsecondfuncthirdfunc)之间的所有内容都转换为 promise / future 表单,应该自动运行而不是Javascript开发人员的业务。

或者有没有真正好的论据不这样做?

1 个答案:

答案 0 :(得分:3)

我在http://calculist.org/blog/2011/12/14/why-coroutines-wont-work-on-the-web/描述了设计这一方面的基本原理 - 简而言之,完整的协同程序(这是你所描述的)会干扰JavaScript的运行完成模型的精神,使得它更难预测您的代码何时可以像Java,C#和C ++这样的多线程语言“抢占”。博客文章还详细介绍了其他一些原因。