Generator函數是ES6提供的一種異步編程解決方案,語法行為與傳統函數完全不同。Generator 生成器允許你通過寫一個可以保存自己狀態的的簡單函數來定義一個迭代算法。Generator 是一種可以停止并在之后重新進入的函數。生成器的環境(綁定的變量)會在每次執行后被保存,下次進入時可繼續使用。generator 字面上是“生成器”的意思,在 ES6 里是迭代器生成器,用于生成一個迭代器對象。
Generator函數的調用方法與普通函數一樣,也是在函數名后面加上一對圓括號。不同的是,調用Generator函數后,該函數并不執行,返回的也不是函數運行結果,而是一個指向內部狀態的指針對象。接下來調用遍歷器對象的next方法,才會使指針移向下一個狀態。也就是說,每次調用next方法,內部指針就從函數頭部或上一次停下來的地方開始執行,直到遇到下一個yield語句(或return語句)為止。這樣可以產生一定的序列值。
Generator 可以幫助我們讓代碼風格更整潔--用同步的代碼風格來寫異步代碼,它本質上是一個可以暫停計算并且可以隨后返回表達式的值的函數。
Generator對象是由一個生成器函數 generator function 返回的。并且它是同時遵守 The iterable protocol 可遍歷協議和The iterator protocol 迭代器模式協議。
function* gen() { yield 1; yield 2; yield 3; } var g = gen(); // "Generator { }"
co是一個基于ES6 Generator特性實現的異步流程同步化寫法的工具庫。co 函數庫是著名程序員 TJ Holowaychuk 于2013年6月發布的一個小工具,用于 Generator 函數的自動執行。
co需要使用Promise特性。co 函數庫其實就是將兩種自動執行器(Thunk 函數和 Promise 對象),包裝成一個庫。使用 co 的前提條件是,Generator 函數的 yield 命令后面,只能是 Thunk 函數或 Promise 對象。
有一個 Generator 函數。
var gen = function* () { var a = Promise.resolve(1); var b = Promise.resolve(2); var c = Promise.resolve(3); var res = yield [a, b, c]; console.log(res); // 輸出:[1, 2, 3] }; co(gen).then(function(){ console.log('Generator函數執行完畢了'); // 輸出:Generator函數執行完畢了 });
上面代碼中,Generator 函數只要傳入 co 函數,就會自動執行。co 函數返回一個 Promise 對象,可以用 then 方法添加回調函數。
新聞熱點
疑難解答