ES6 Generators

生成器函數


function* quips(name) {
  yield "hello " + name + "!";
  yield "i hope you are enjoying the blog posts";
  if (name.startsWith("X")) {
    yield "it's cool how your name starts with X, " + name;
  }
  yield "see you later!";
}
  • 生成器函數以function*標注
  • yield關鍵字,會暫停生成器的執行,在之后可以繼續執行

生成器的使用

> var iter = quips("jorendorff");
  [object Generator]
> iter.next()
  { value: "hello jorendorff!", done: false }
> iter.next()
  { value: "i hope you are enjoying the blog posts", done: false }
> iter.next()
  { value: "see you later!", done: false }
> iter.next()
  { value: undefined, done: true }

當執行生成器函數時,函數不會立即執行,調用next方法會執行到下一個yield語句,并返回yield的值

當所有yield執行完成后,返回 { value: undefined, done: true }

生成器函數是迭代器

function* range(start, stop) {
  for (var i = start; i < stop; i++)
    yield i;
}

for (var value of range(0, 3)) {
  alert("Ding! at floor #" + value);
}
  • 生成器對象的next函數可以傳值,傳入的值作為yield的返回值
  • return方法結束生成器方法的執行,但如果生成器方法里有finally,則會執行finally
  • throw方法會在yield方法出拋出異常
  • 如果生成器對象的return方法沒被調用,卻被回收了,則finally不會被執行

yield*可以返回iterator的所有值

function* concat(iter1, iter2) {
  for (var value of iter1) {
    yield value;
  }
  for (var value of iter2) {
    yield value;
  }
}

以上可以簡寫為:

function* concat(iter1, iter2) {
  yield* iter1;
  yield* iter2;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容