function* g() {
var o =yield 1;
return o;
}
var gen = g();
console.log(gen.next());
console.log(gen.next());
這段代碼執(zhí)行的時候為什么第二次返回的value是undefined,變量o的值為什么沒返回?
yield 1 返回的是你 gen.next(X) 中的 X
https://developer.mozilla.org...
因為你 gen.next() 沒有傳值,則值為 undefined.
function* g() {
var o =yield 1;
return o;
}
var gen = g();
console.log(gen.next());
console.log(gen.next(123));
會輸出 123
這是ES6的新feature,function 后面帶 * 的叫做generator。
在generator內(nèi)部你可以使用 yield 語句:
function* genFunc () {
console.log('step 1')
yield 1
console.log('step 2')
yield 2
console.log('step 3')
return 3
}
當你調(diào)用一個generator函數(shù)的時候,你會獲得一個iterator對象。
var gen = genFunc()
這個對象有一個方法叫做 next()。每當你調(diào)用 next() 的時候,generator函數(shù)內(nèi)部就會執(zhí)行直到遇到下一個 yield 語句,然后暫停在那里,并返回一個對象。這個對象含有被 yield 的值和generator函數(shù)的運行狀態(tài)。
var ret = gen.next() // 輸出: 'step 1'
console.log(ret.value) // 1
console.log(ret.done) // false
可以看到,只輸出了 'step 1'。這意味著直到你運行下一次 next() 之前,generator內(nèi)部的狀態(tài)處于暫停之中,但是卻不影響generator外部的代碼繼續(xù)運行。
ret = gen.next() // 輸出 'step 2'
console.log(ret.value) // 2
console.log(ret.done) // false
直到generator函數(shù)內(nèi)部不再有 yield 語句存在了,這時你再調(diào)用 next(),獲得的就會是該函數(shù)的常規(guī)返回值 (return 的值):
ret = gen.next() // 輸出 'step 3'
console.log(ret.value) // 3
console.log(ret.done) // true
同時,iterator對象的 next() 方法是可以傳遞一個參數(shù)的。這個參數(shù)將會成為generator函數(shù)內(nèi)對應 yield 語句的返回值:
function* genFunc () {
var result = yield 1
console.log(result)
}
var gen = genFunc()
gen.next() // 此時generator內(nèi)部執(zhí)行到 yield 1 并暫停,但還未對result賦值!
// 即使異步也可以!
setTimeout(function () {
gen.next(123) // 給result賦值并繼續(xù)執(zhí)行,輸出: 123
}, 1000)
雖然本意是用來提供一個可循環(huán)對象,但可以看到,generator函數(shù)可以借助 yield 在需要的時候才繼續(xù)執(zhí)行剩余的語句,并且傳遞回一個值。這讓你想到了什么?沒錯,回調(diào)函數(shù)!更關(guān)鍵的是,借助generator我們可以用同步的邏輯來表達異步的流程,而不需要嵌套回調(diào)。我們只需要對創(chuàng)建iterator對象、調(diào)用next()以及外部函數(shù)做一些適當?shù)姆庋b和修改,就可以獲得無回調(diào)的異步流程控制。
這個理念由TJ大神(同時也是 Koa 的作者)在 co 這個庫里實現(xiàn)了,而 Koa 本身也是基于 co 來封裝中間件函數(shù)(每一個中間件函數(shù)都是generator)。co 的實現(xiàn)其實不過300行代碼,但是包含了很精髓的一些東西,值得細看。
**注:以下代碼示例均需要 node.js v0.11.7+ 帶 --harmony 參數(shù)才能運行。**北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領(lǐng)域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。