Generator 是 ES6 新加入的標準。
Generator 是一種特殊類型的函式,一般的函式只會回傳一個值,但是 generator 卻會對不同的請求分別產生一個值回傳,而且在請求之間暫停程式的執行。
function* gen() {
yield 1;
yield 2;
yield 3;
}
var generator = gen();
console.log(generator.next().value); // 1
console.log(generator.next().value); // 2
console.log(generator.next().value); // 3
Generator 的寫法初次看到會覺得很奇怪,是在function
後面加一個*
,在程式碼裡面,在要回傳的值前面加上yield
關鍵字。
直接呼叫 generator 並不會得到我們要的回傳值,而是一個 iteratorobject,透過它我們才可以和 generator 互動,利用這個物件提供的方法來操控 generator。
Iterator 提供了.next()
的方法,讓 generator 從上次暫停的地方開始執行,到下一個 yield
關鍵字或是函式結束為止。但是 iterator 給我們的並非只是計算出來的值,而是一個物件,裡面包含有 iterator 狀態的done
屬性,以及計算值的value
屬性。如果 iterator 還沒有結束,done
的值是false
,如果全部的程式碼都跑完了,就會變成true
,而這個 iterator 就不能再使用了。