定義:
promise是為了解決回調地獄的難題出現的,那么 Generator 就是為了解決異步問題而出現的。
普通函數,如果調用它會立即執行完畢;Generator 函數,它可以暫停,不一定馬上把函數體中的所有代碼執行完畢,正是因為有這樣的特性,它可以用來解決異步問題。
生成器函數
generator是es6標準引入的新的數據類型。一個generator看上去像函數,但可以返回多次
?generator函數和普通函數區別有兩個,1.function和函數名之間有一個*號。2.函數內部使用了yield表達式
可以把generator函數看作是可以暫停和繼續執行的函數。與普通函數不同的是,當generator函數被調用時,?并不會立即執行,而是返回一個Iterator對象,通過這個對象可以逐步遍歷Generator函數內部狀態,generator函數內部用yield關鍵字來控制返回值,并可以隨時停止和恢復函數的執行
寫法:它在 function 和函數名之間有一個*
號。
Generator 函數返回是一個迭代器對象,需要通過 xx.next 方法來完成代碼執行。在調用 generator 函數時,它只是進行實例化工作,它沒有讓函數體里面的代碼執行,需要通過 next 方法來讓它執行,比如像下面這樣:
function* gen() {console.log(1)
}// 定義迭代器對象
const iterator = gen()
iterator.next() // 如果不執行這一局代碼,1不會被打印
當 next 方法執行時遇到了 yield 就會停止,直到你再次調用 next 方法。比如像下面這樣:
function* gen() {yield 1console.log('A')yield 2console.log('B')yield 3console.log('C')return 4
}// 定義迭代器對象
const iterator = gen()
iterator.next() // 執行 gen 函數,打印為空,遇到 yield 1 停止執行
iterator.next() // 繼續執行函數,打印 A,遇到 yield 2 停止執行
iterator.next() // 繼續執行函數,打印 B,遇到 yield 3 停止執行
iterator.next() // 繼續執行函數,打印 C
next 方法調用時,它是有返回值的,它的返回值就是 yield 后面的值或函數的返回值。比如下面這個例子:
// 同步代碼
function* gen() {yield 1console.log('A')yield 2console.log('B')yield 3console.log('C')return 4
}// 定義迭代器對象
const iterator = gen()// 異步代碼
console.log(iterator.next()) // 打印為空 next返回 {value:1,done:false}
console.log(iterator.next()) // A next返回 {value:2,done:false}
console.log(iterator.next()) // B next返回 {value:3,done:false}
console.log(iterator.next()) // C next返回 {value:4,done:true},如果函數有return值,最后一個next方法,它的value值為return的值 value:4;如果沒有。值為 undefined
?
js中Generator函數詳解_js generator-CSDN博客
https://www.cnblogs.com/pengnima/p/13051324.html
JS 中的 Generator 有哪些用處? - 知乎
JS中的Generator函數及其應用場景_generator應用場景-CSDN博客