Generator


什么是 Generator 函數

  •  Generator 函數是 ES6 提供的一種異步編程解決方案
  •  Generator 函數內部可以封裝多個狀態,可以理解為是一個狀態機

Generator函數與普通函數的區別

  • 調用 Generator 函數,無論該函數有沒有  return 返回值,都會返回一個迭代器對象 
  • 調用  Generator 函數后,函數中封裝的代碼不會立即執行

定義一個Generator函數

function *gen() {}
  • 只需要在  function 后加一個  * 星號,就代表這個函數是一個  Generator 函數

Generator函數結合 yield 關鍵字一起使用才有意義

function *gen() {
  console.log(1);
  yield 'generator1'; // 通過 yield 定義一個狀態
  console.log(2);
  yield 'generator2'; // 又定義一個狀態
}
  • yield 只能在  Generator 函數中才能使用
  • yield 會將  Generator 函數分割成多個部分執行,當前  yield 這行及其上一個 yield 之間的為一個部分
  1.  第一個部分  console.log(1); yield 'generator1'; // 通過 yield 定義一個狀態 
  2.  第二個部分   console.log(2); yield 'generator2'; // 又定義一個狀態 
  • 調用  Generator 函數,返回一個可迭代對象   let it = gen();  通過這個可迭代對象的  next  來執行  yield 切割的部分
  • // 1
    it.next(); // { value: 'generator1', done: false }

 

傳遞參數

function *gen() {
  console.log(1);
  const val1 = yield 'generator1'; // 調用可迭代對象的 next()函數時傳遞的參數放入 val1 中
  console.log(val1)
  console.log(2);
  const val2 = yield 'generator2'; // 再次調用可迭代對象的 next()函數時傳遞的參數放入 val2 中
  console.log(val2);
}
let it = gen(); // 調用Generator函數生成一個可迭代對象
it.next(); // 不能傳遞參數
it.next('one'); // 將 one 賦值給 val1
it.next('two'); // 將 two 賦值給 val2
  • 通過迭代對象第一次調用  next()  函數不能傳遞參數

通過 Generator 快速實現對象的 Iterator

let obj = {
  name: 'zhangsan',
  age: 66,
  [Symbol.iterator]: function *() {
    let keys = Object.keys(this);
    for (let i = 0; i < keys.length; i++) {
      yield this[keys[i]];
    }
  }
}
let it = obj[Symbol.iterator]();
it.next(); // { value: 'zhangsan', done: false }
it.next(); // { value: 66, done: false }
it.next(); // { value: undefined, done: true }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM