ECMAScript 6应该带来生成器函数和迭代器。生成器函数(具有function*
语法)返回迭代器。迭代器有一个next
方法,当重复调用时,它执行生成器函数的主体,在每个yield
运算符处重复暂停和恢复执行。
ECMAScript 6 wiki on generators还引入了“委托收益率”yield*
运算符,如下所示:
yield*
运算符委托给另一台生成器。这为组合生成器提供了便利的机制。
“委托另一台发电机”是什么意思?如何使用yield*
“方便地组合生成器”?
[您可以使用--harmony-generators
标志在Node v0.11.3中使用生成器。]
答案 0 :(得分:40)
委托给另一个生成器意味着当前生成器自动停止生成值,而是生成另一个生成器生成的值,直到它耗尽它为止。然后它会恢复生成自己的值(如果有的话)。
例如,如果secondGenerator()
生成的数字从10
到15
,而firstGenerator()
会产生从1
到5
的数字,但代表是在生成secondGenerator()
后2
,firstGenerator()
生成的值将为:
1, 2, 10, 11, 12, 13, 14, 15, 3, 4, 5
function* firstGenerator() {
yield 1;
yield 2;
// Delegate to second generator
yield* secondGenerator();
yield 3;
yield 4;
yield 5;
}
function* secondGenerator() {
yield 10;
yield 11;
yield 12;
yield 13;
yield 14;
yield 15;
}
console.log(Array.from(firstGenerator()));
答案 1 :(得分:2)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
int PICK_IMAGE_REQUEST = 100;
Bundle extras = null;
if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK) {
extras = data.getExtras();
}
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
ImageView profilePhoto = (ImageView) findViewById(R.id.profileImageView);
profilePhoto.setImageBitmap(photo);
}
结果是
function *gimme1to2_10to15_3to5() {
var ten = gimme10to15();
yield 1; yield 2;
for (var i = 10; i <= 20; i++)
yield *ten;
yield 3; yield 4; yield 5;
}
function *gimme10to15() {
for (var i = 10; i <= 15; i++)
var x = yield i;
}
let gen = gimme1to2_10to15_3to5();
var ar = [];
for (var i = 0; i < 12; i++)
{
var r = gen.next();
ar [i] = r.value + (r.done ? "!" : "..");
}
console.log (ar.join (", "));
注释
yield * 的函数会询问内部生成器的11个值,但只接收它应该的10..15。多余的收益* 电话无效。
内置生成器的已完成值对其调用者返回的已完成没有影响。
输出结尾显示 undefined!,因为测试循环写入超出所需数量的值,以显示生成器的 done = true
此输出来自ES6测试场Babel,上面显示的语义应视为截至2016年2月5日的临时。
答案 2 :(得分:2)
委托收益率不必委托给另一个生成器 ,而是委托给任何迭代器,所以第一个答案有点不确定。考虑这个简单的例子:
`
function *someGenerator() {
yield 0;
yield [1,2,3]
yield* [1,2,3]
}
for (v of someGenerator()) {
console.log(v);
}
`
生成器本身内没有其他函数 - 但yield
委托给Array Object Iterator
的迭代器; - )