您好,登錄后才能下訂單哦!
呃,今天學了generator,拿出來做個標記。
這個詞在node.js里的做用是為了做異步操作,generator實際上就是promise的語法糖,什么叫語法糖呢,就是....自己度娘吧。。
我的個人理解,異步操作就是程序執行到generator的yield標記的語句時,暫時暫停當前程序的執行,然后把被標記的代碼執行完,到返回結果的時候當前程序再繼續執行,這樣就可以在被標記語句的下一行代碼里使用被標記語句得到的結果。主要用于不確定執行時長的語句,比如:讀取數據庫,讀取文件等。
看代碼:
'use strict'; function * aa(){ yield 'aa'; } let a = aa(); console.log(a.next().value);//aa
generator函數的寫法就是在function 和函數名之前要有一個星號(*),星號左右最少有一個空格,可以是貼著function關鍵字,也可以是貼著函數名,當然兩邊都有空格也是可以的,然后在函數體里,有需要做異步操作的語句前加上yield,以前看別人的貼子的時候,要么只有代碼,要么就一兩句解釋,我這人悟性不夠,往往看不懂,這里講的雖然啰嗦,但更容易懂是吧,下面來一行一行的解釋一下這段代碼是什么意思:
首先,定義了一個generator函數aa,
函數體里有需要做異步操作的語句'aa',用yield標記,
然后聲明一個變量a指向aa()返回的遍歷器,對,你沒看錯,在 let a=aa();這句的時候aa()方法還沒有執行,a在這時候只是得到aa()的一個遍歷器,
然后下一句輸出a.next().value,這句的意思是什么?在這之前需要先說明一點。generator函數的執行方式是先生成一個遍歷器,然后有一個指針指向最開始執行處,然后函數體中的每一個yield就是一個節點,想往下執行,就只能用遍歷器的next()方法去指向下一個yield直到結束,這一句的意思就是執行yield 'aa';這句代碼,本文寫的例子很簡單,yield 'aa'你可以寫成 yield 讀取文件;
然后等這句執行完會把結果返回給指針,可以用 next().value取出這個yield標記的代碼執行的結果。
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()函數體返回。
恩。那后面的三行輸出語句我想就應該不用再多說了,,
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。