什么是 Generator 函數
- Generator 函數是 ES6 提供的一種異步編程解決方案
- Generator 函數內部可以封裝多個狀態,可以理解為是一個狀態機
Generator函數與普通函數的區別
- 調用 Generator 函數,無論該函數有沒有 return 返回值,都會返回一個迭代器對象
- 調用 Generator 函數后,函數中封裝的代碼不會立即執行
定義一個Generator函數
- 只需要在 function 后加一個 * 星號,就代表這個函數是一個 Generator 函數
Generator函數結合 yield 關鍵字一起使用才有意義
function *gen() {
console.log(1);
yield 'generator1'; // 通過 yield 定義一個狀態
console.log(2);
yield 'generator2'; // 又定義一個狀態
}
- yield 只能在 Generator 函數中才能使用
- yield 會將 Generator 函數分割成多個部分執行,當前 yield 這行及其上一個 yield 之間的為一個部分
- 第一個部分 console.log(1); yield 'generator1'; // 通過 yield 定義一個狀態
- 第二個部分 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 }