什么是生成器函數?

生成器函數(Generator Function)是 JavaScript 中一種特殊的函數,它可以在執行過程中暫停并在之后恢復執行。生成器函數使用 function* 語法定義,并且內部使用 yield 表達式來暫停函數執行并返回一個值。每次調用生成器函數返回的迭代器的 next 方法時,生成器函數會從上次暫停的地方繼續執行,直到遇到下一個 yield 表達式或函數結束。

生成器函數的定義和用法

定義生成器函數

生成器函數使用 function* 關鍵字定義:

function* generatorFunction() {yield 'First output';yield 'Second output';return 'Finished';
}
調用生成器函數

調用生成器函數會返回一個迭代器對象,該對象具有 next 方法:

const gen = generatorFunction();
迭代生成器函數

使用 next 方法迭代生成器函數,每次調用 next 方法,生成器函數會執行到下一個 yield 表達式,并返回一個對象 { value: any, done: boolean }

console.log(gen.next()); // { value: 'First output', done: false }
console.log(gen.next()); // { value: 'Second output', done: false }
console.log(gen.next()); // { value: 'Finished', done: true }
console.log(gen.next()); // { value: undefined, done: true }

生成器函數的特性

  1. 暫停和恢復執行
    生成器函數在遇到 yield 表達式時會暫停執行,并返回 yield 后的值。函數的狀態會被保存下來,下一次調用 next 方法時會從暫停的地方繼續執行。

  2. 雙向通信
    可以通過 next 方法傳遞參數給生成器函數,生成器函數內部可以接收這個參數并進行處理。

  3. 實現迭代器協議
    生成器函數返回的迭代器對象遵循迭代器協議,可以用于 for...of 循環和其他需要迭代器的地方。

示例

簡單生成器函數
function* simpleGenerator() {yield 1;yield 2;yield 3;
}const gen = simpleGenerator();console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: undefined, done: true }
雙向通信的生成器函數
function* counter() {let count = 0;while (true) {const increment = yield count;if (increment != null) {count += increment;} else {count++;}}
}const countGenerator = counter();console.log(countGenerator.next().value); // 0
console.log(countGenerator.next(2).value); // 2
console.log(countGenerator.next(3).value); // 5
console.log(countGenerator.next().value); // 6
用于異步操作的生成器函數

生成器函數可以與 Promise 結合使用,處理異步操作,使異步代碼更接近同步風格。

function fetchData(url) {return new Promise((resolve) => {setTimeout(() => {resolve(`Data from ${url}`);}, 1000);});
}function* asyncTaskQueue() {const data1 = yield fetchData('https://api.example.com/endpoint1');console.log(data1);const data2 = yield fetchData('https://api.example.com/endpoint2');console.log(data2);const data3 = yield fetchData('https://api.example.com/endpoint3');console.log(data3);
}function run(generator) {const iterator = generator();function handle(result) {if (result.done) return;result.value.then(data => {handle(iterator.next(data));});}handle(iterator.next());
}run(asyncTaskQueue);

生成器函數的優勢

  • 靈活性:生成器函數可以暫停和恢復,適用于復雜的控制流邏輯。
  • 雙向通信:可以通過 yieldnext 實現雙向數據傳遞。
  • 內存友好:在處理大型數據集時,可以逐個生成數據項,而不是一次性加載所有數據。
  • 異步編程:與 Promise 結合,可以更容易地處理異步操作。

生成器函數為 JavaScript 提供了一種強大而靈活的方式來處理迭代、異步操作和復雜的控制流。理解并善用生成器函數可以大大提升代碼的可讀性和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43974.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43974.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43974.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

rabbitmq集群創建admin用戶之后,提示can access virtual hosts是No access狀態

問題描述: 因業務需要使用的rabbitmq是3.7.8版本的,rabbitmq在3.3.0之后就允許使用guest賬號的權限了,所以需要創建一個administrator標簽的用戶。 如下操作創建的用戶: 創建完成之后就提示如下的報錯: 注&#xff1a…

php表單提交并自動發送郵件給某個郵箱(示例源碼下載)

只需要將以下代碼內容進行復制即可用到自己的程序/API接口中&#xff1a; <?php if(!empty($_POST[is_post]) && $_POST[is_post]1){$url "https://www.aoksend.com/index/api/send_email";$name $_POST[name];$email $_POST[email];$subject $_POS…

探索Mojo模型:解鎖機器學習模型的可解釋性之旅

探索Mojo模型&#xff1a;解鎖機器學習模型的可解釋性之旅 在人工智能和機器學習領域&#xff0c;模型的可解釋性是一個至關重要的議題。隨著模型變得越來越復雜&#xff0c;理解模型的決策過程成為了一個挑戰。Mojo模型作為一種模型序列化格式&#xff0c;提供了一種方法來部…

Python 給存入 Redis 的鍵值對設置過期時間

Redis 是一種內存中的數據存儲系統&#xff0c;與許多傳統數據庫相比&#xff0c;它具有一些優勢&#xff0c;其中之一就是可以設置數據的過期時間。通過 Redis 的過期時間設置&#xff0c;可以為存儲在 Redis 中的數據設置一個特定的生存時間。一旦數據到達過期時間&#xff0…

mybatis日志記錄方案

首先對指定表進行監控 對表進行監控,那么就要使用的是statementInterceptor 攔截器 使用攔截器那么就要寫intercepts寫攔截條件進行攔截 監控只對與增刪改 查詢不進行監控 對于字段的監控,是誰修改了字段,那么就進行報警,或者提醒 消息提醒使用釘釘機器人進行消息提醒 P…

軟鏈接node_modules

公司項目很多微應用的子項目公用同一套模板&#xff0c;也就會使用同一個node_modules 1.先創建3個同樣的項目,并安裝一個其中的一個node_modules給他丟到外邊 2.win r -------> cmd --------> ctrlshift enter(已管理員身份打開cmd) 3.在窗口分別執行以下代碼…

視頻減小技巧:十大頂級視頻壓縮軟件

視頻壓縮軟件會盡可能地壓縮視頻&#xff0c;以便上傳到各個網站。通常&#xff0c;4K 或更高質量的視頻體積更大。壓縮軟件有助于壓縮體積。在這里&#xff0c;我們來討論一下 10 款最佳視頻壓縮軟件。 十大頂級視頻壓縮軟件 1. 奇客壓縮寶 奇客壓縮寶是由Geekersoft公司開發…

基于SpringBoot+MySQL的租房項目+文檔

&#x1f497;博主介紹&#x1f497;&#xff1a;?在職Java研發工程師、專注于程序設計、源碼分享、技術交流、專注于Java技術領域和畢業設計? 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的老師 Wechat / QQ 名片 :) Java精品實戰案例《700套》 2025最新畢業設計選題推薦…

數據庫系統中的Undo和Redo

在數據庫管理系統&#xff08;DBMS&#xff09;中&#xff0c;undo 和 redo 是兩種用于事務管理和故障恢復的重要機制。它們主要涉及事務的提交、回滾以及系統故障后的數據恢復。 Undo&#xff08;撤銷&#xff09; 作用&#xff1a;undo 用于撤銷未提交事務所做的修改&#…

極狐Gitlab使用(1)

目錄 續接上篇&#xff1a;極狐Gitlab安裝部署-CSDN博客 1. 關閉注冊功能 2. 創建群組 3. 創建用戶 5. 邀請成員到群組 6. 設置導入導出項目源 7. 通過gitee導入庫 8. 通過倉庫URL導入 9. 自創建項目 10. 默認分支main的權限 11. 使用普通用戶進入自建庫 12. 創建用…

java的遍歷的方法對比 效率對比

在 Java 中&#xff0c;遍歷對象的方式主要取決于對象的類型和數據結構。以下是幾種常見的遍歷方式&#xff0c;以及它們的效率比較&#xff1a; 普通的 for 循環&#xff1a; 效率&#xff1a;高。使用普通的 for 循環可以直接根據索引來訪問元素&#xff0c;適用于數組和實現…

Ubuntu系統上安裝Apache和WordPress

** 第一步跟新系統包 ** 首先跟新系統包 sudo apt update sudo apt upgrade第二步下載安裝apache sudo apt install apache2 ##查看apache的狀態是否啟動成功 sudo systemctl status apache2 ##查看服務器的ip地址 sudo ip a通過ip地址進行訪問apache頁面 第三步下載安裝…

git patch怎么使用?

通常當我們提到 "patch" 時&#xff0c;我們可能指的是以下幾種情況&#xff1a; 1. **應用補丁文件**&#xff1a; 如果你有一個 .patch 文件&#xff0c;你可以使用 git apply 命令來應用它。 bash git apply your-patch-file.patch 這會將補丁文件中的更改應用到…

軟件架構之嵌入式系統設計

軟件架構之嵌入式系統設計 第 12 章&#xff1a;嵌入式系統設計12.1 嵌入式系統概論12.2 嵌入式系統的組成12.2.1 硬件架構12.2.2 軟件架構 12.3 嵌入式開發平臺與調試環境12.3.1 嵌入式系統軟件開發平臺12.3.2 嵌入式開發調試 第 12 章&#xff1a;嵌入式系統設計 隨著計算機…

力扣 1兩數之和

nums [2,7,6,3] target 9 需要在這個中找到 nums中數字下標&#xff0c;累加和等于target 也就是說既要數字下標&#xff0c;又要nums中數字&#xff0c;還要查找 因此&#xff0c;考慮map這種既有key 又有value的哈希表 問題是 map,unordered_map, muti_map用哪一個呢&a…

人工智能時代,零基礎學IT,我首推Python作為你編程入門語言!

人工智能時代為什么將 Python 稱為第一語言&#xff1f; 因為python適應了人工智能時代&#xff1a; 人工智能時代對于代碼的簡便性有很大要求&#xff0c;像傳統的C/CPP/Java學習較為復雜&#xff0c;學習路線長&#xff0c;對于很多零基礎的人入門困難。python的兼容性&…

k8s集群部署mysql8主備

一、搜索mysql8版本 # helm search repo mysql# helm pull bitnami/mysql --version:11.1.2# tar -zxf mysql-11.1.2.tgz# cd mysql 二、修改value.ysqml文件 動態存儲類自己提前搭建。 # helm install mysql8 -n mysql-cluster ./ -f values.yaml NAME: mysql8 LAST DEPLOYED…

Java:方法與類的奧秘——解鎖編程世界的鑰匙

探索編程的奧秘 在程序設計的廣闊海洋中&#xff0c;Java如同一艘穩健的航船&#xff0c;引領著無數開發者穿越代碼的波濤。本篇深度探索&#xff0c;將帶您潛入Java的內心深處&#xff0c;揭開“方法”與“類”的神秘面紗。這兩個概念&#xff0c;不僅是Java的基石&#xff0…

大模型日報 2024-07-11

大模型日報 2024-07-11 大模型資訊 CVPR世界第二僅次Nature&#xff01;谷歌2024學術指標出爐&#xff0c;NeurIPS、ICLR躋身前十 谷歌2024學術指標公布&#xff0c;CVPR位居第二&#xff0c;超越Science僅次于Nature。CVPR、NeurIPS、ICLR三大頂會躋身TOP 10。 CVPR成全球第二…

【簡歷】南京某大學頂級211碩士:拿offer可能性低

注&#xff1a;為保證用戶信息安全&#xff0c;姓名和學校等信息已經進行同層次變更&#xff0c;內容部分細節也進行了部分隱藏 簡歷說明 這份簡歷的背景是南京的一所頂級211的碩士,從學校背景來講呢,求職目標就是大廠的秋招&#xff0c;但是因為項目描述的亮點比較少&#x…