同时一些例子上的使用;认识一下状态管理函数;
首先还是要了解yield *;
首先如果Generator中调用另外一个Generator是没有效果;
function* foo(){
yield "x";
yield "y";
};
function baz(){
yield 'a';
foo();
yield 'b';
};
for(let a of baz()){
console.log(a);
};
//a
//b;
在其中直接执行是没有任何效果的;这个时候就需要使用到;yield *在Generator中执行另外一个Generator函数;
function* bar() {
yield 'x';
yield* foo();
yield 'y';
}
// 等同于
function* bar() {
yield 'x';
yield 'a';
yield 'b';
yield 'y';
}
// 等同于
function* bar() {
yield 'x';
for (let v of foo()) {
yield v;
}
yield 'y';
}
for (let v of bar()){
console.log(v);
}
// "x"
// "a"
// "b"
// "y"
从语法上讲yield后面跟着的是一个遍历器对象;需要在后面加上*表面后面跟着是一个遍历器对象;
let delegatedIterator = (function* () {
yield 'Hello!';
yield 'Bye!';
}());
let delegatingIterator = (function* () {
yield 'Greetings!';
yield* delegatedIterator;
yield 'Ok, bye.';
}());
for(let value of delegatingIterator) {
console.log(value);
}
// "Greetings!
// "Hello!"
// "Bye!"
// "Ok, bye."
上面代码中,delegatingIterator是代理者,delegatedIterator是被代理者。由于yield* delegatedIterator语句得到的值,是一个遍历器,所以要用星号表示。运行结果就是使用一个遍历器,遍历了多个 Generator 函数,有递归的效果
yield* 后面跟着个Generator函数;默认是部署了一个for循环;
function* concat(iter1, iter2) {
yield* iter1;
yield* iter2;
}
// 等同于
function* concat(iter1, iter2) {
for (var value of iter1) {
yield value;
}
for (var value of iter2) {
yield value;
}
}
网友评论