node.js學習筆記之generator

呃,今天學了generator,拿出來作個標記。node

這個詞在node.js裏的作用是爲了作異步操做,generator實際上就是promise的語法糖,什麼叫語法糖呢,就是....本身度娘吧。。數據庫

個人我的理解,異步操做就是程序執行到generator的yield標記的語句時,暫時暫停當前程序的執行,而後把被標記的代碼執行完,到返回結果的時候當前程序再繼續執行,這樣就能夠在被標記語句的下一行代碼裏使用被標記語句獲得的結果。主要用於不肯定執行時長的語句,好比:讀取數據庫,讀取文件等。promise

看代碼:異步

'use strict';

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

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

generator函數的寫法就是在function 和函數名以前要有一個星號(*),星號左右最少有一個空格,能夠是貼着function關鍵字,也能夠是貼着函數名,固然兩邊都有空格也是能夠的,而後在函數體裏,有須要作異步操做的語句前加上yield,之前看別人的貼子的時候,要麼只有代碼,要麼就一兩句解釋,我這人悟性不夠,每每看不懂,這裏講的雖然囉嗦,但更容易懂是吧,下面來一行一行的解釋一下這段代碼是什麼意思:ide

首先,定義了一個generator函數aa,函數

函數體裏有須要作異步操做的語句'aa',用yield標記,指針

而後聲明一個變量a指向aa()返回的遍歷器,對,你沒看錯,在 let a=aa();這句的時候aa()方法尚未執行,a在這時候只是獲得aa()的一個遍歷器,generator

而後下一句輸出a.next().value,這句的意思是什麼?在這以前須要先說明一點。generator函數的執行方式是先生成一個遍歷器,而後有一個指針指向最開始執行處,而後函數體中的每個yield就是一個節點,想往下執行,就只能用遍歷器的next()方法去指向下一個yield直到結束,這一句的意思就是執行yield 'aa';這句代碼,本文寫的例子很簡單,yield 'aa'你能夠寫成  yield 讀取文件;it

而後等這句執行完會把結果返回給指針,能夠用 next().value取出這個yield標記的代碼執行的結果。io


generator函數能夠嵌套:

'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'

這段代碼和上面代碼惟一的不一樣是中間嵌套了一個generator函數

yield* aa();

那有些童鞋就會問了,爲何不直接寫 aa();?那是由於上文說了,aa()這樣直接調用generator函數,函數體是不會執行的,只會返回一個遍歷器,函數體都還沒執行,固然沒有結果。

那又有些童鞋會問,其餘的yield 後不是都沒有星號麼?爲何這個有星號?這個問題問的好,不加星號的話,直接yield aa(),其實是和直接調用aa()是同樣的,爲何,yield只是一個標記,去執行被標記的代碼,那和直接調用aa()有什麼區別呢?但加了星號就不同了,他會等aa()函數體返回。

恩。那後面的三行輸出語句我想就應該不用再多說了,,

相關文章
相關標籤/搜索