同時一些例子上的使用;認識一下狀態管理函數;
首先還是要了解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;
}
}