亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

ES6中的迭代器、Generator函數及Generator函數的異步操作方法

2024-05-06 16:50:47
字體:
來源:轉載
供稿:網友

最近在寫RN相關的東西,其中涉及到了redux-saga ,saga的實現原理就是ES6中的Generator函數,而Generator函數又和迭代器有著密不可分的關系。所以本篇博客先學習總結了iterator相關的東西,然后又介紹了Generator相關的內容,最后介紹了使用Generator進行異步編程。本篇博客所涉及的示例使用TypeScript語言編寫,當然所涉及的特性是基于ES6規范的,使用TS語言不影響來闡述和總結ES6的相關特性。下篇博客準備系統梳理一下saga相關的內容。

一、迭代器

之前再聊迭代器模式時,使用Swift語言自定義過迭代器,在TS中也有迭代器。此處的迭代器與之前所介紹的迭代器是大同小異的。首先我們先來自定義一個迭代器,然后再看一下ES6中的迭代器的使用方式。

1、自定義迭代器

下方定義了一個迭代器函數,函數說明如下:

  • 該函數接收一個數組類型的參數,我們可以將需要創建迭代器的數組作為參數傳進來。
  • 函數內部定義了一個 nextIndex 參數用來記錄迭代器的位置。
  • 該函數返回一個迭代器對象,該迭代器對象包含一個key為 next , value為匿名函數的屬性。
  • 這個key為 next 的匿名方法的返回值為每次迭代器的返回結果對象,這個結果對象由 兩個屬性組成,value表示本次迭代器的值,done表示迭代器遍歷是否結束。遍歷到最后,最終返回的值為 { value: undefine, done: true }, 也就意味著迭代器遍歷結束,value是undefined, done為true?!?/li>

 

ES6,迭代器,Generator,異步操作

自定義完迭代器后,我們就可以對上述代碼進行測試了。

首先創建了一個數組,然后將數組傳給 makeIterator 函數。

而 makeIterator 函數會返回一個含有next方法的迭代器對象。

  • 我們將這個迭代器對象命名為 iterator,我們就可以通過 iterator的next方法來依次獲取數組中的值了。
  • 我們通過 while 循環來不斷的調用 iterator中的next方法,直到next方法返回的對象中的done值為true時,表示遍歷結束。
  • 遍歷結束后,我們再次調用 next() 方法,得到的是{ value: undefind, done: true } 的對象,表示遍歷結束,獲取的value值為 undefined。

ES6,迭代器,Generator,異步操作2、2。ES6中的迭代器

類似于Swift語言的特性,ES6規范中我們可以直接通過一些對象獲取該對象所對應的迭代器,如下所示:

下方示例中使用的數組和上面使用的list是一個,首先我們通過 list[Symbol.iterator]() 的方式獲取了 list對應的迭代器。

(Symbol也是一種數據類型, 該數據類型用來表示獨一無二的對象)該迭代器的使用方式和輸出結果與上述我們自定義的迭代器的使用方式完全一致, 輸出結果與之前的結果也是一致的。

ES6,迭代器,Generator,異步操作

3、使用 for - of 遍歷迭代器

上述方式創建的迭代器我們是使用的while循環來進行遍歷的,除了while循環,我們還可以通過for-of 進行遍歷。

此處的 for - of遍歷方式類似于Swift語言中的 for - in循環,可以依次的自動去除迭代器中的值。

下方就是使用for - of 來循環遍歷創建的迭代器。

從下方示例中我們不難看出直接輸出的是迭代器返回對象的value值。

ES6,迭代器,Generator,異步操作

4、在類中添加迭代器

我們可以在自己的類中添加相關方法,使我們自己的類支持迭代器。下方就創建了一個 RangeIterator 類,該類的作用是可以定義一個范圍,構造器可以接受兩個值,一個是范圍的起始位置另一個是范圍的結束點。下方我們為該范圍類添加了自定義迭代器,具體說明如下:

在該類中添加了一個名為 next 的箭頭函數,在該函數中做的事情與之前我們自定義的next方法差不多,主要是用來獲取下一個值然后返回。

然后又實現一個[Symbole.iterator]函數,用來獲取迭代器對象。最后我們可看到定義的范圍對象可以向迭代器那樣使用for-of進行遍歷。

ES6,迭代器,Generator,異步操作

5、調用迭代器的場景

迭代器的使用場景還是蠻多的,解構賦值、擴展運算符、Generator函數、yield*, 下方會簡單的列舉出來。

(1)、對數組或者集合的解構賦值

在下方代碼片段中首先創建了一個名為 mySet 的集合對象。然后通過循環給集合中添加了一些值。然后通過 解構賦值 的形式,取出了 mySet 中的第一個值和第二個值。此刻的結構賦值會調用集合的迭代器接口,取出第一個值和第二個值,分別賦值給 first 和 second。

第二個紅框中在結構賦值是使用了擴展運算符,該操作符會使 others 接收 firstItem 剩下的值。

ES6,迭代器,Generator,異步操作

(2)、擴展運算符 ...  

接下來來看另一個擴展運算符的例子。

首先定義了一個字符串,然后通過擴展運算符將該字符串的每個字符拆分到一個數組中,輸出結果如下所示。擴展運算符還可以使用到對象上,如第二個示例所示。

ES6,迭代器,Generator,異步操作

(3)、在Generator函數的 yield * 中使用

稍后會詳細的介紹 Generator 函數,一個Generator 函數返回的是一個迭代器,我們可以調用該迭代器的 next 方法來執行每一個 yield。在 Generator 函數中,可以使用 yield * 后邊跟一個可便遍歷的結構,這樣我們就可以在外部統一使用 next 來訪問這個可遍歷的結構的每一個值,如下所示:

ES6,迭代器,Generator,異步操作

二、Generator函數及異步編程

理解完迭代器,接下來來看一下Generator函數。如果做過RN開發的話,如果使用過 redux - saga的話,應該對Generator函數不陌生。Generator函數是ES6提供的異步編程的解決方案,解析了我們先看一下Generator函數基本使用方式,再看一下如何使用Generator函數進行異步編程。

1、Generator函數的定義和使用

下方定義了一個 Generator函數,Generator函數的定義與普通函數的定義差不多,只不過是function關鍵字后邊跟了一個*號。然后函數體內部使用了一個個 yield語句來表明每一步的操作。定義完Generator函數后,下方緊接著的是使用,首先調用該Generator函數獲取了一個迭代器,每次執行這個迭代器的next方法都會一次的執行一個yield語句。輸出結果和上面的迭代器沒啥區別。

ES6,迭代器,Generator,異步操作

2、next的參數

在調用Generator函數返回的迭代器時,是可以往next方法中傳入參數的。next 方法可以帶一個參數,該參數被當做上一個 yield 語句的返回值。下方就是給 next 傳參的一個示例:

下方定義了一個Generator函數,用來輸出自增的值,每次調用next都會獲取一個自增的值。當調用 rg.next(true) 時,這個true就會被賦值給 reset, 因為這個reset被視為上個yield的返回值,上一個yield執行后,會將index設置為 -1。那么rg.next(true)對應的 yield執行是,index是從 -1 開始自增的,自增后為0,所以 rg.next(true) 對應的 yield 的值為0。

ES6,迭代器,Generator,異步操作

下方是另一個示例:

下方定義了一個名為testNextValue的Generator函數,該函數本身接收了一個參數。在調用該Generator函數時,傳入了一個參數,這個參數不是Next的參數,是Generator函數本身的參數。

Generator函數在調用時,函數體并不會馬上執行,在調用next函數時才會執行函數中yield語句體。

第一次調用Next,給Next傳入了一個值 5,也就是說明 x = 5。

第一次執行next會調用第一個 yield 語句體,test1.next(2) = x + 1 = 5 + 1 = 6, 所以第一次調用next的結果值為

6。第二次調用 Next,傳入的Next參數為3。

這個3 被作為上一個 yield 語句體的返回值,yield(x + 1) 的返回值為 3。那么 y 的值就為 2 * 3 = 6。yield中的值為 y / 3 = 2,所以第二次執行next獲取的值為 2。第三次調用Next傳入的參數為 4,這個 4 被作為上個yield語句體返回的參數,所以z = 4, 上分析過了 x = 5, y = 6, 所以 x + y + z = 15, 第三次執行next為 15。再次調用Next,因為語句體執行完了,所以獲取到的是undefined。

ES6,迭代器,Generator,異步操作

三、使用Generator函數進行異步編程

接下來實現一個簡單的示例,使用Generator函數結合Promise回調模擬一下異步編程。

首先定義了一個 getPromise函數,該函數接收兩個參數,一個參數表示網絡請求的參數,另一個參數表示請求時間。該函數返回一個 Promise對象,在Promise對象中我們使用了setTimeout來模擬請求的延遲,根據傳入的timeout來決定延遲時間,延遲時間到達后會執行 resolve方法,將相關值回調出來。

ES6,迭代器,Generator,異步操作

然后定義了一個Generator函數,在該函數中通過yield來調用每個函數,下方的Generator函數比較簡單,在此就不做過多贅述了。

ES6,迭代器,Generator,異步操作

然后我們通過for -of 一次執行Generator函數的next方法,進而來執行每個getPromise方法。

ES6,迭代器,Generator,異步操作  

下方是具體的執行結果,從執行結果中不難看出,每次獲取的yield值是一個Promise對象,我們可在該Promise對象的then方法中獲取到相關的結果值。從輸出順序中可以看出,會先輸出時間小的那個結果。

ES6,迭代器,Generator,異步操作

總結

以上所述是小編給大家介紹的ES6中的迭代器、Generator函數及Generator函數的異步操作,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av网站导航| 国产一区视频在线| 成人福利在线视频| 亚洲国产精品久久久| 亚洲乱码国产乱码精品精天堂| 国产精品成人av性教育| 亚洲自拍偷拍福利| 欧美性精品220| 亚洲黄在线观看| 欧美xxxx做受欧美| 国产剧情日韩欧美| 国产精品福利网| 亚洲影院色在线观看免费| 最近2019年中文视频免费在线观看| 97视频免费观看| 91精品国产九九九久久久亚洲| 亚洲欧美日韩一区在线| 久久国产精品久久国产精品| 成人春色激情网| 色综合色综合网色综合| 91精品美女在线| 最近的2019中文字幕免费一页| 国产日产欧美精品| 国产视频自拍一区| 国产精品美女久久久久久免费| 欧美xxxx18性欧美| 欧美www视频在线观看| 欧美亚洲国产视频| 久久久久久久久中文字幕| 国产99久久精品一区二区永久免费| 亚洲人午夜色婷婷| 国产精彩精品视频| 欧洲精品在线视频| 欧美精品videossex性护士| 国产69精品99久久久久久宅男| 国产经典一区二区| 日韩视频亚洲视频| 91精品久久久久久久久久久| 热久久美女精品天天吊色| www.日韩系列| 欧美另类极品videosbestfree| 国产亚洲欧洲高清一区| 国产91热爆ts人妖在线| 亚洲精品免费在线视频| 国产精品视频白浆免费视频| 欧美视频免费在线观看| 欧美日韩成人在线观看| 亚洲国产又黄又爽女人高潮的| 亚洲老司机av| 亚洲国产欧美一区二区三区久久| 超碰91人人草人人干| 亚洲一区美女视频在线观看免费| 久久久亚洲影院你懂的| 亚洲wwwav| 亚洲天堂一区二区三区| 久久久精品免费| 91亚洲va在线va天堂va国| 亚洲国产日韩欧美综合久久| 国产精品高清网站| 欧美黄色片在线观看| 国产女精品视频网站免费| 日本欧美精品在线| 中文字幕亚洲欧美日韩高清| 日韩最新中文字幕电影免费看| 日韩在线观看视频免费| 国产精品视频区| 国产亚洲欧美另类中文| 成人福利网站在线观看| 国产精品青青在线观看爽香蕉| 91禁国产网站| 欧美电影免费播放| 久久免费少妇高潮久久精品99| 欧美另类高清videos| 91免费人成网站在线观看18| 亚洲三级免费看| 欧美激情在线视频二区| 91亚洲一区精品| 日韩精品极品在线观看播放免费视频| 国产精品91久久久| 俺去亚洲欧洲欧美日韩| 日韩av在线免费播放| 亚洲成人黄色网| 亚洲国产成人精品女人久久久| 亚洲欧美中文日韩在线v日本| 国产精品亚洲аv天堂网| 亚洲专区在线视频| 久久久久久久久久久亚洲| 欧美二区在线播放| 久久亚洲综合国产精品99麻豆精品福利| 黄色成人在线播放| 色婷婷亚洲mv天堂mv在影片| 成人黄色在线观看| 欧美激情在线有限公司| 亚洲xxx自由成熟| 久久精品国产69国产精品亚洲| 粗暴蹂躏中文一区二区三区| 亚洲视频axxx| 国产精品r级在线| 九九热这里只有在线精品视| 久久av在线看| 亚洲国产小视频在线观看| 亚洲网站在线播放| 欧美性受xxxx白人性爽| 日韩高清电影好看的电视剧电影| 亚洲福利视频久久| 在线播放国产一区中文字幕剧情欧美| 亚洲网址你懂得| 欧美性生交大片免费| 久久久国产精品一区| 国产偷国产偷亚洲清高网站| 国产精品嫩草影院一区二区| 亚洲伊人成综合成人网| 精品国产一区二区三区在线观看| 成人做爰www免费看视频网站| 自拍偷拍亚洲精品| 亚洲香蕉成人av网站在线观看| 亚洲男人天堂2019| 亚洲国产小视频在线观看| 国产色视频一区| 777国产偷窥盗摄精品视频| 欧美成人自拍视频| 欧美日本黄视频| 成人妇女免费播放久久久| 成人综合网网址| 日av在线播放中文不卡| 日韩美女毛茸茸| 亚洲精品美女久久久久| 国产97在线|亚洲| 高清视频欧美一级| 国产精品99一区| 狠狠久久亚洲欧美专区| 亚洲国产欧美久久| 久久综合免费视频| 国产香蕉精品视频一区二区三区| 亚洲国产天堂久久国产91| 国产中文字幕亚洲| 国产精品aaa| xvideos亚洲人网站| 国产精品99免视看9| 欧美性极品少妇精品网站| 欧美黑人巨大精品一区二区| 欧美巨大黑人极品精男| 亚洲最大福利视频网站| 成人网欧美在线视频| 国内精品免费午夜毛片| 91国产精品91| 日韩av片免费在线观看| 欧美成人在线影院| 性视频1819p久久| 国产精品扒开腿做爽爽爽视频| 久久天天躁夜夜躁狠狠躁2022| 久久偷看各类女兵18女厕嘘嘘| 久久av在线播放| 亚洲精品一区二区在线| 97色在线观看| 成人精品在线视频| 中文字幕在线看视频国产欧美| 久久久国产精品x99av| 久久精品国产96久久久香蕉| 国产一区二区丝袜高跟鞋图片| 日韩理论片久久| 久久久亚洲精选| 亚洲欧美三级伦理| 亚洲国产精品大全|