js-generator基礎(第四周)
看了幾個小時generator相關文章,發現里面東西太多,這周想放棄寫這篇,轉寫其他方面的,上次就用了這招,不過沒有沒有找到其他可寫的,最后決定寫一篇相當基礎的generator
generator是什么
- generator也是為了解決地獄回調問題的,和上周的promise一樣都是為了實現異步編程,本質還是各種回調;
在某些時候也可以認為generator為es6中新定義的數據類型,這種數據類型和函數很像,每個函數只能返回一個結果,即只能return一次,如果在某些函數中沒有看到return,其實質在函數結尾是存在一個隱藏的return undefined 的,而generator不同,可以返回多次
實現異步編程的原理
- 通過協程方式,協程就是多個線程相互協作,完成異步任務,如下圖:
generator的使用
generator用 function*,比普通函數多出一個“ * ”,generator除了return語句外,可以用yield返回多次,也可以看成generator遇到yield是就返回一個值,並且generator暫停在這,當需要繼續執行是只用調用generator.next()就可以繼續執行,遇到yield又會暫停,再調用generator.next()后繼續執行……
function* gen(){ yield 1; yield 2; yield 3; yield 4; yield 5; return "結束"; } let g = gen(); let i = 0; let st = setInterval(() => {//每間隔500ms執行一次g.next(),執行7次,並在控制台打印 i++; console.log(g.next()); if(i>7){ clearInterval(st); } }, 500);
結果:
可以看出generator 遇到yleld就會暫停,只有當調用generator.next()才會向下執行,調用這個方法會返回{value: x, done: true/false},這個對象中value是yield的返回值,done表示generator是否執行結束,只有當執行到return時,這個對象中的done才會變成true,說明執行結束;如果仍然執行的話,如上圖后兩條,執行到done為true時就不要執行了
<完>
20180816
發揮不廣泛