您的位置:首页 > 其它

ES6学习——生成器(Generators):yield*

2016-01-28 15:24 253 查看
yield*起到一个委派的作用,跟在它后面的表达式需要是个iterator,在规范的14.4.14中有详细的描述。下面我们看看怎么使用它:

function* foo() {
yield* [1,2,3];
}
function* foo() {
yield 1;
yield 2;
yield 3;
}
function* bar() {
yield* foo();//生成器本身也是迭代器,所以可以用在yield*的后面
}


由于生成器可以有返回值,那么可以利用yield*来递归调用另一个生成器:

function* foo(x) {
if (x < 3) {
x = yield* foo( x + 1 );
}
return x * 2;
}

var g = foo(1);
console.log(g.next());//Object {value: 24, done: true}


在看看yield*对return和throw方法的处理,由于Chrome只实现了throw,下面就只看throw了:
function* callee() {
try {
yield 'b';
yield 'c';
} finally {
console.log('finally callee');
}
}

function* caller() {
try {
yield 'a';
yield* callee();
yield 'd';
} catch (e) {
console.log('[caller] ' + e);
}
}

let genObj = caller();
console.log(genObj.next().value);//a
console.log(genObj.next().value);//b
genObj.throw(new Error('Problem!'))
//finally callee
//[caller] Error: Problem!
上面的例子可以看出来,yield*有转发throw的作用,把callee中的throw调用,转发到了caller中。



*以上全部代码在Chrome 48下通过测试
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: