新聞中心
呃,今天學(xué)了generator,拿出來(lái)做個(gè)標(biāo)記。
這個(gè)詞在node.js里的做用是為了做異步操作,generator實(shí)際上就是promise的語(yǔ)法糖,什么叫語(yǔ)法糖呢,就是....自己度娘吧。。
我的個(gè)人理解,異步操作就是程序執(zhí)行到generator的yield標(biāo)記的語(yǔ)句時(shí),暫時(shí)暫停當(dāng)前程序的執(zhí)行,然后把被標(biāo)記的代碼執(zhí)行完,到返回結(jié)果的時(shí)候當(dāng)前程序再繼續(xù)執(zhí)行,這樣就可以在被標(biāo)記語(yǔ)句的下一行代碼里使用被標(biāo)記語(yǔ)句得到的結(jié)果。主要用于不確定執(zhí)行時(shí)長(zhǎng)的語(yǔ)句,比如:讀取數(shù)據(jù)庫(kù),讀取文件等。
看代碼:
'use strict'; function * aa(){ yield 'aa'; } let a = aa(); console.log(a.next().value);//aa
generator函數(shù)的寫(xiě)法就是在function 和函數(shù)名之前要有一個(gè)星號(hào)(*),星號(hào)左右最少有一個(gè)空格,可以是貼著function關(guān)鍵字,也可以是貼著函數(shù)名,當(dāng)然兩邊都有空格也是可以的,然后在函數(shù)體里,有需要做異步操作的語(yǔ)句前加上yield,以前看別人的貼子的時(shí)候,要么只有代碼,要么就一兩句解釋,我這人悟性不夠,往往看不懂,這里講的雖然啰嗦,但更容易懂是吧,下面來(lái)一行一行的解釋一下這段代碼是什么意思:
首先,定義了一個(gè)generator函數(shù)aa,
函數(shù)體里有需要做異步操作的語(yǔ)句'aa',用yield標(biāo)記,
然后聲明一個(gè)變量a指向aa()返回的遍歷器,對(duì),你沒(méi)看錯(cuò),在 let a=aa();這句的時(shí)候aa()方法還沒(méi)有執(zhí)行,a在這時(shí)候只是得到aa()的一個(gè)遍歷器,
然后下一句輸出a.next().value,這句的意思是什么?在這之前需要先說(shuō)明一點(diǎn)。generator函數(shù)的執(zhí)行方式是先生成一個(gè)遍歷器,然后有一個(gè)指針指向最開(kāi)始執(zhí)行處,然后函數(shù)體中的每一個(gè)yield就是一個(gè)節(jié)點(diǎn),想往下執(zhí)行,就只能用遍歷器的next()方法去指向下一個(gè)yield直到結(jié)束,這一句的意思就是執(zhí)行yield 'aa';這句代碼,本文寫(xiě)的例子很簡(jiǎn)單,yield 'aa'你可以寫(xiě)成 yield 讀取文件;
然后等這句執(zhí)行完會(huì)把結(jié)果返回給指針,可以用 next().value取出這個(gè)yield標(biāo)記的代碼執(zhí)行的結(jié)果。
generator函數(shù)可以嵌套:
'use strict'; function * aa(){ yield 'aa'; } let test = function* (){ yield 'hello'; yield* aa(); yield 'ok'; } let test1 = test(); console.log(test1.next().value);//'hello' console.log(test1.next().value);//'aa' console.log(test1.next().value);//'ok'
這段代碼和上面代碼唯一的不同是中間嵌套了一個(gè)generator函數(shù)
yield* aa();
那有些童鞋就會(huì)問(wèn)了,為什么不直接寫(xiě) aa();?那是因?yàn)樯衔恼f(shuō)了,aa()這樣直接調(diào)用generator函數(shù),函數(shù)體是不會(huì)執(zhí)行的,只會(huì)返回一個(gè)遍歷器,函數(shù)體都還沒(méi)執(zhí)行,當(dāng)然沒(méi)有結(jié)果。
那又有些童鞋會(huì)問(wèn),其他的yield 后不是都沒(méi)有星號(hào)么?為什么這個(gè)有星號(hào)?這個(gè)問(wèn)題問(wèn)的好,不加星號(hào)的話,直接yield aa(),實(shí)際上是和直接調(diào)用aa()是一樣的,為什么,yield只是一個(gè)標(biāo)記,去執(zhí)行被標(biāo)記的代碼,那和直接調(diào)用aa()有什么區(qū)別呢?但加了星號(hào)就不一樣了,他會(huì)等aa()函數(shù)體返回。
恩。那后面的三行輸出語(yǔ)句我想就應(yīng)該不用再多說(shuō)了,,
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
本文題目:node.js學(xué)習(xí)筆記之generator-創(chuàng)新互聯(lián)
鏈接地址:http://www.dlmjj.cn/article/jcpjs.html