成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文帶你搞懂JavaScript的Generator函數

開發 前端
本文基于JavaScript基礎,介紹了Generator函數 ,重點介紹了如何進行Generator 組合,采用圖文結合的方式。采用JavaScript語言,能夠更直觀的的理解,希望能夠幫助讀者更好的學習。

[[422297]]

大家好,我是進階學習者。

一、概念

常規函數只會返回一個單一值(或者不返回任何值)。

而 Generator 可以按需一個接一個地返回(“yield”)多個值。它們可與 iterable 完美配合使用,從而可以輕松地創建數據流。

二、Generator 函數

要創建一個 generator,需要一個特殊的語法結構:function*,即所謂的 “generator function”。

Generator 函數與常規函數的行為不同。在此類函數被調用時,它不會運行其代碼。而是返回一個被稱為 “generator object” 的特殊對象,來管理執行流程。

例如,可以創建一個 generator 并獲取其第一個產出的(yielded)值:

  1. function* generateSequence() { 
  2.   yield 1; 
  3.   yield 2; 
  4.   return 3; 
  5. let generator = generateSequence(); 
  6. let one = generator.next(); 
  7. alert(JSON.stringify(one)); // {value: 1, done: false

截至目前,只獲得了第一個值,現在函數執行處在第二行:

圖片

讓再次調用 generator.next()。代碼恢復執行并返回下一個 yield 的值:

  1. let two = generator.next(); 
  2.  
  3. alert(JSON.stringify(two)); // {value: 2, done: false

如果第三次調用 generator.next(),代碼將會執行到 return 語句,此時就完成這個函數的執行:

  1. let three = generator.next(); 
  2. alert(JSON.stringify(three)); // {value: 3, done: true

運行結果:

三、Generator 是可迭代的

當你看到 next() 方法,或許你已經猜到了 generator 是 可迭代(iterable)的。(譯注:next() 是 iterator 的必要方法)

可以使用 for..of 循環遍歷它所有的值:

  1. function* generateSequence() { 
  2.   yield 1; 
  3.   yield 2; 
  4.   return 3; 
  5. let generator = generateSequence(); 
  6. for(let value of generator) { 
  7.   alert(value); // 1,然后是 2 

運行結果:

for..of 寫法是不是看起來比 .next().value 優雅多了?

注:

上面這個例子會先顯示 1,然后是 2,然后就沒了。它不會顯示 3!

這是因為當 done: true 時,for..of 循環會忽略最后一個 value。因此,如果想要通過 for..of 循環顯示所有的結果,必須使用 yield 返回它們:

  1. function* generateSequence() { 
  2.   yield 1; 
  3.   yield 2; 
  4.   yield 3; 
  5. let generator = generateSequence(); 
  6. for(let value of generator) { 
  7.   alert(value); // 1,然后是 2,然后是 3 

因為 generator 是可迭代的,可以使用 iterator 的所有相關功能。

例如:spread 語法 ...:

  1. function* generateSequence() { 
  2.   yield 1; 
  3.   yield 2; 
  4.   yield 3; 
  5. let sequence = [0, ...generateSequence()]; 
  6. alert(sequence); // 0, 1, 2, 3 

運行結果:

四、Generator 組合

Generator 組合(composition)是 generator 的一個特殊功能,它允許透明地(transparently)將 generator 彼此“嵌入(embed)”到一起。

例如,有一個生成數字序列的函數:組合的 generator 的例子:

  1. function* generateSequence(start, end) { 
  2.   for (let i = start; i <= end; i++) yield i; 
  3. function* generatePasswordCodes() { 
  4.   // 0..9 
  5.   yield* generateSequence(48, 57); 
  6.   // A..Z 
  7.   yield* generateSequence(65, 90); 
  8.   // a..z 
  9.   yield* generateSequence(97, 122); 
  10. let str = ''
  11. for(let code of generatePasswordCodes()) { 
  12.   str += String.fromCharCode(code); 
  13. alert(str); // 0..9A..Za..z 

運行結果:

generator.throw

上面的例子中觀察到的那樣,外部代碼可能會將一個值傳遞到 generator,作為 yield 的結果。

但是它也可以在那里發起(拋出)一個 error。這很自然。

因為 error 本身也是一種結果,要向 yield 傳遞一個 error,應該調用 generator.throw(err)。

在這種情況下,err 將被拋到對應的 yield 所在的那一行。

例:

"2 + 2?" 的 yield 導致了一個 error:

  1. function* gen() { 
  2.   try { 
  3.     let result = yield "2 + 2 = ?"; // (1) 
  4.     alert("The execution does not reach here, because the exception is thrown above"); 
  5.   } catch(e) { 
  6.     alert(e); // 顯示這個 error 
  7.   } 
  8. let generator = gen(); 
  9.  
  10. let question = generator.next().value; 
  11.  
  12. generator.throw(new Error("The answer is not found in my database")); // (2) 

運行結果:

五、總結

本文基于JavaScript基礎,介紹了Generator函數 ,重點介紹了如何進行Generator 組合,采用圖文結合的方式。采用JavaScript語言,能夠更直觀的的理解,希望能夠幫助讀者更好的學習。

歡迎大家積極嘗試,有時候看到別人實現起來很簡單,但是到自己動手實現的時候,總會有各種各樣的問題,切勿眼高手低,勤動手,才可以理解的更加深刻。

代碼很簡單,希望對你學習有幫助。

 

責任編輯:姜華 來源: 前端進階學習交流
相關推薦

2024-11-19 13:20:55

2021-09-28 07:12:10

avaScriptCurrying柯里化

2023-03-06 21:29:41

mmap技術操作系統

2019-08-06 09:00:00

JavaScript函數式編程前端

2022-08-15 15:39:23

JavaScript面向對象數據

2021-12-01 11:40:14

Python 輸入輸出

2021-09-11 10:41:27

PythonPickle模塊

2021-12-29 17:38:17

JavaScripttypeof前端

2021-10-14 10:25:05

JavaScript類型函數

2021-10-11 10:19:48

Javascript 高階函數前端

2021-11-06 10:18:30

Python變量常量

2021-08-05 06:54:05

觀察者訂閱設計

2022-03-24 08:51:48

Redis互聯網NoSQL

2024-04-12 12:19:08

語言模型AI

2020-05-11 14:35:11

微服務架構代碼

2023-05-31 13:32:08

Javalambda函數

2021-07-21 09:24:25

MongoDB數據庫 Python

2023-09-08 08:20:46

ThreadLoca多線程工具

2021-03-22 10:05:59

netstat命令Linux

2023-09-15 12:00:01

API應用程序接口
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品一区二区三区高清免费 | 国产精品久久国产精品 | 成人免费大片黄在线播放 | 国产精品美女久久久久aⅴ国产馆 | 精品久久99 | 亚洲欧洲在线观看视频 | 亚洲第一成人影院 | 久久99精品久久久久久青青日本 | 欧美黑人一级爽快片淫片高清 | 久久国产精品精品国产色婷婷 | 天天看天天干 | 日韩午夜在线观看 | 欧美在线a | 亚洲福利av | 一区二区在线不卡 | 日本在线一二 | 91大神新作在线观看 | 午夜专区| 久久久国产一区二区三区 | 中文字幕在线播放第一页 | 成人性视频免费网站 | 国产一卡二卡三卡 | 国产一区二区三区久久久久久久久 | 欧美三区 | 欧美视频二区 | 亚洲一区二区三区在线 | 操久久| 国产亚洲精品精品国产亚洲综合 | 日本精品一区二区三区视频 | 青青草华人在线视频 | 成人美女免费网站视频 | 日本中出视频 | 美女日批免费视频 | 欧美一级特黄aaa大片在线观看 | 亚洲精品视频在线观看视频 | 日韩中文字幕网 | 成人欧美一区二区三区白人 | 亚洲综合无码一区二区 | 中国一级特黄视频 | 久久一二 | 国产精品久久久久久久岛一牛影视 |