node.js學(xué)習(xí)筆記之generator

呃,今天學(xué)了generator,拿出來做個(gè)標(biāo)記。

為任丘等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及任丘網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、任丘網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

這個(gè)詞在node.js里的做用是為了做異步操作,generator實(shí)際上就是promise的語法糖,什么叫語法糖呢,就是....自己度娘吧。。

我的個(gè)人理解,異步操作就是程序執(zhí)行到generator的yield標(biāo)記的語句時(shí),暫時(shí)暫停當(dāng)前程序的執(zhí)行,然后把被標(biāo)記的代碼執(zhí)行完,到返回結(jié)果的時(shí)候當(dāng)前程序再繼續(xù)執(zhí)行,這樣就可以在被標(biāo)記語句的下一行代碼里使用被標(biāo)記語句得到的結(jié)果。主要用于不確定執(zhí)行時(shí)長的語句,比如:讀取數(shù)據(jù)庫,讀取文件等。

看代碼:

'use strict';

function * aa(){
	yield 'aa';
}

let a = aa();
console.log(a.next().value);//aa

generator函數(shù)的寫法就是在function 和函數(shù)名之前要有一個(gè)星號(*),星號左右最少有一個(gè)空格,可以是貼著function關(guān)鍵字,也可以是貼著函數(shù)名,當(dāng)然兩邊都有空格也是可以的,然后在函數(shù)體里,有需要做異步操作的語句前加上yield,以前看別人的貼子的時(shí)候,要么只有代碼,要么就一兩句解釋,我這人悟性不夠,往往看不懂,這里講的雖然啰嗦,但更容易懂是吧,下面來一行一行的解釋一下這段代碼是什么意思:

首先,定義了一個(gè)generator函數(shù)aa,

函數(shù)體里有需要做異步操作的語句'aa',用yield標(biāo)記,

然后聲明一個(gè)變量a指向aa()返回的遍歷器,對,你沒看錯(cuò),在 let a=aa();這句的時(shí)候aa()方法還沒有執(zhí)行,a在這時(shí)候只是得到aa()的一個(gè)遍歷器,

然后下一句輸出a.next().value,這句的意思是什么?在這之前需要先說明一點(diǎn)。generator函數(shù)的執(zhí)行方式是先生成一個(gè)遍歷器,然后有一個(gè)指針指向最開始執(zhí)行處,然后函數(shù)體中的每一個(gè)yield就是一個(gè)節(jié)點(diǎn),想往下執(zhí)行,就只能用遍歷器的next()方法去指向下一個(gè)yield直到結(jié)束,這一句的意思就是執(zhí)行yield 'aa';這句代碼,本文寫的例子很簡單,yield 'aa'你可以寫成  yield 讀取文件;

然后等這句執(zhí)行完會把結(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();

那有些童鞋就會問了,為什么不直接寫 aa();?那是因?yàn)樯衔恼f了,aa()這樣直接調(diào)用generator函數(shù),函數(shù)體是不會執(zhí)行的,只會返回一個(gè)遍歷器,函數(shù)體都還沒執(zhí)行,當(dāng)然沒有結(jié)果。

那又有些童鞋會問,其他的yield 后不是都沒有星號么?為什么這個(gè)有星號?這個(gè)問題問的好,不加星號的話,直接yield aa(),實(shí)際上是和直接調(diào)用aa()是一樣的,為什么,yield只是一個(gè)標(biāo)記,去執(zhí)行被標(biāo)記的代碼,那和直接調(diào)用aa()有什么區(qū)別呢?但加了星號就不一樣了,他會等aa()函數(shù)體返回。

恩。那后面的三行輸出語句我想就應(yīng)該不用再多說了,,

網(wǎng)頁名稱:node.js學(xué)習(xí)筆記之generator
文章分享:http://muchs.cn/article40/gdedeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版網(wǎng)站建設(shè)、域名注冊網(wǎng)站排名、動態(tài)網(wǎng)站ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管