JavaScript中的奇怪的yield语法

时间:2011-08-11 16:47:53

标签: javascript yield taskjs

我刚刚看了一眼Dave Herman非常有趣的task.js。在他的例子中,他有这条线:

var [foo, bar] = yield join(read("foo.json"),
                                read("bar.json")).timeout(1000);

我熟悉生成器但我不明白yield表达式如何评估可以分配给[foo,bar]的东西。我实际上不会期望表达式可以赋值给任何东西,因为它与return基本相同。

JS的yield语法似乎有点未被记录,我找不到关于此的信息。

所以澄清我的问题:最终被分配给foo和bar的是什么?

2 个答案:

答案 0 :(得分:6)

实际上,相关段落略低于https://developer.mozilla.org/En/New_in_JavaScript_1.7

  

通过调用next()方法启动生成器后,即可   可以使用send(),传递将被视为的特定值   最后yield的结果。然后,生成器将返回操作数   随后的yield

我认为这只有在通过直接调用其方法来使用生成器时才有意义,而不是在循环其值时使用 - 循环将始终在生成器上调用next()而从不send()。< / p>

在某种程度上,生成器执行类似于协作式多任务处理。生成器一直执行,直到找到yield语句。它将控制权返回给生成器上调用next()send()的任何人。然后调用者继续执行,直到执行下一个next()send()调用 - 现在生成器再次执行。每次值都可以来回传递。

这是一个简单的例子:

function gen()
{
  var [foo, bar] = yield 1;
  console.log("Generator got: " + foo + ", " + bar);
}

// This creates a generator but doesn't run it yet
var g = gen();

// Starts generator execution until a yield statement returns a value
var result = g.next()
console.log("Received from generator: " + result);

// Continue generator execution with [2, 3] being the return value
// of the yield statement. This will throw StopIteration because the
// iterator doesn't have any more yield statements.
g.send([2, 3]);

答案 1 :(得分:0)

https://developer.mozilla.org/En/New_in_JavaScript_1.7

  

包含yield关键字的函数是一个生成器。当你调用它时,它的形式参数绑定到实际的参数,但它的实体并没有被实际评估。而是返回一个generator-iterator。每次调用generator-iterator的next()方法都会执行迭代算法的另一次传递。每个步骤的值是yield关键字指定的值。将yield视为返回的generator-iterator版本,指示算法的每次迭代之间的边界。每次调用next()时,生成器代码将从yield之后的语句中恢复。