我刚刚看了一眼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的是什么?
答案 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之后的语句中恢复。