1. 程式人生 > >generator,yield個人理解

generator,yield個人理解

spa div span 開始 png color time als 執行

實驗代碼:

 1   function test1(arg){
 2         setTimeout(function(){
 3             // it.next(arg);
 4             console.log(‘先執行,並不觸發‘);
 5         },200)
 6     }
 7     
 8     function test2(){
 9         setTimeout(function(){
10             it.next(‘第一個‘)
11         },0)
12     }
13   // 編寫一個Generator;
14 function *gen(){ 15 var a = yield test1(‘hhhhhhhh‘); 16 console.log(a); 17 var b = yield test2(); 18 console.log(b); 19 } 20 21 var it = gen();

1.代碼存在一個gen()函數, 第14行 存在兩個yield 語句,(15,17)

2. 執行gen()函數(21行),以為是Generator函數,所以函數體內語句不會執行,只是返回一個叠代器,

3.在console 中執行 it.next(),

gen函數會執行到第一個yield語句(15行),gen函數在此停止,並且觸發test1函數,輸出 "先執行,並不觸發",

技術分享

4. 再執行 it.next(),gen()函數從剛才停止位置開始執行: 16~17行

技術分享

因為a無返回值,所以首先輸出的是 undefined;

執行到17行,gen()函數理應在此停止,因為觸發的test2 函數體內觸發了 it.next(‘第一個’),所以gen()函數返回值並且繼續向下執行;

it.next() 在test1,test2 函數中的作用是:返回值給當前yield,並且觸發下一個 yield 執行

取消test1中註釋的 it.next(arg), 觸發gen() 執行會一直執行到gen()函數結束

問題點:

1.test1, test2 中的it.next()並不輸出 {value: ‘undefined‘, done: false},

2. 在 test1 中可以獲取下一個yield 中的 {value: ‘undefined‘, done: false}

3. it.next() 產生的 {value: ‘undefined‘, done: false}, 其中的value 就是其觸發的yield 後面跟得表達式產生的值;

generator,yield個人理解