generator,yield個人理解
阿新 • • 發佈:2017-10-29
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個人理解