yield的理解:yield命令是異步兩個階段的分界線
須要先對迭代器和生成器進行理解:異步
迭代器:是一種支持next()操做的對象。它包含一組元素,當執行next()時,返回其中一個元素;當全部元素都被返回後,生成一個StopIteration異常;函數
生成器:迭代器的一種,是一種特殊的函數,經過使用yield操做將函數構形成迭代器普通的函數有一個入口,有一個返回值;當函數被調用時,從入口開始執行,結束時返回相應的返回值。生成器定義的函數,有多個入口和多個返回值;對生成器執行next()操做,進行生成器的入口開始執行代碼,yield操做向調用者返回一個值,並將函數掛起;掛起時,函數執行的環境和參數被保存下來;對生成器執行另外一個next()操做時,參數從掛起狀態被從新調用,進入上次掛起的執行環境繼續下面的操做,到下一個yield操做時重複上面的過程。spa
function *foo2(x) { var y = 2 * (yield (x + 1)); var z = yield (y / 3); return (x + y + z); } var it2 = foo2( 5 ); // note: not sending anything into `next()` here console.log( it2.next() ); // { value:6, done:false } console.log( it2.next(12) ); // { value:8, done:false } console.log( it2.next(13) ); // { value:42, done:true }
解析上面的代碼:it2建立Generator實例,執行 Generator的next方法,能夠接收一個參數,做爲上個階段異步任務的返回結果code
第一次執行next方法返回x+1 =6 函數未執行完畢 ;對象
第二次執行next方法 ,接收一個參數,做爲上個階段異步任務的返回結果(x+1),被函數體內的變量 y接收 y =2*12=24,第二次執行返回 (y/3)=8,函數未執行完畢;blog
第三次執行,從記錄的上下文繼續執行,接收參數被z接收 z = (y/3),參數13做爲上次返回結果(y/3),z=13.執行return 6+24+13=42;函數執行完畢;it