Generator的一些使用

同時一些例子上的使用;認識一下狀態管理函數;

首先還是要了解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;
  }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容