ES6产量:第一次调用next()的参数会发生什么?

时间:2014-01-07 16:54:40

标签: ecmascript-harmony

考虑这段代码:

function foo(a) {
  console.log("Mul =", a);
  return a * 2;
};

function * process(start) {
  // next() #1
  var result = start;

  console.log("Pre-processing =", result);
  result = yield foo(result);
  // next() #2
  console.log("Process result 1 =", result);
  result = yield foo(result);
  // next() #3
  console.log("Process result 2 =", result);
  result = yield foo(result);
  // next() #4
  console.log("Process result 3 =", result);

  return foo(result);
}

var it = process(1);
console.log("#1");
console.log("Next 1 =", /*#1*/it.next("bar"));
console.log("#2");
console.log("Next 2 =", /*#2*/it.next(3));
console.log("#3");
console.log("Next 3 =", /*#3*/it.next(7));
console.log("#4");
console.log("Next 4 =", /*#4*/it.next(15));

输出

#1
Pre-processing = 1
Mul = 1
Next 1 = { value: 2, done: false }
#2
Process result 1 = 3
Mul = 3
Next 2 = { value: 6, done: false }
#3
Process result 2 = 7
Mul = 7
Next 3 = { value: 14, done: false }
#4
Process result 3 = 15
Mul = 15
Next 4 = { value: 30, done: true }

为什么第一次调用it.next()跳过参数(在上面的代码中,"bar")?或者,换句话说,为什么后续调用中的行为会有所不同?我希望调用生成器函数会跳过参数,并且调用next()实际上会初始化迭代器,使进程更连贯,不是吗?

1 个答案:

答案 0 :(得分:4)

草稿:

经过一些研究后,答案就在和谐的草案中(参见wiki:http://wiki.ecmascript.org/doku.php?id=harmony:generators#methodnext)。

next应该没有争论。但是,似乎用一个参数调用next只相当于用一个参数调用send。这就是答案。 send用于在首先调用时抛出错误(之前没有next)。

所以基本上,你不应该通过将参数传递给next来“初始化”你的迭代器,因为你没有被授权这样做。

在实施中:

然而,这只是规范。总结一下所说的评论,至少有两个理由说明为什么你不能将一个参数传递给你的第一个next并且必须将它传递给你的生成器。

第一个是事实,你需要一些方法来实际获得这个论点。您不能像下次通话let myVar = yield myValue那样执行此操作 第二个是next只接受一个参数,这是非常有限的,而你可以在生成迭代器时将无限量的参数传递给你的生成器。

但是,这只是目前正在发生的事情。没有什么说草案或实施不会改变。我们当然可以想象send接受任意数量的参数(没有理由,但嘿,谁知道),并且能够将它转换为生成器的参数。或者其他什么。