js中Generator函數詳解

定義:

promise是為了解決回調地獄的難題出現的,那么 Generator 就是為了解決異步問題而出現的。

普通函數,如果調用它會立即執行完畢;Generator 函數,它可以暫停,不一定馬上把函數體中的所有代碼執行完畢,正是因為有這樣的特性,它可以用來解決異步問題。

生成器函數

generator是es6標準引入的新的數據類型。一個generator看上去像函數,但可以返回多次

?generator函數和普通函數區別有兩個,1.function和函數名之間有一個*號。2.函數內部使用了yield表達式

可以把generator函數看作是可以暫停和繼續執行的函數。與普通函數不同的是,當generator函數被調用時,?并不會立即執行,而是返回一個Iterator對象,通過這個對象可以逐步遍歷Generator函數內部狀態,generator函數內部用yield關鍵字來控制返回值,并可以隨時停止和恢復函數的執行

寫法:它在 function 和函數名之間有一個*號。

Generator 函數返回是一個迭代器對象,需要通過 xx.next 方法來完成代碼執行。在調用 generator 函數時,它只是進行實例化工作,它沒有讓函數體里面的代碼執行,需要通過 next 方法來讓它執行,比如像下面這樣:

function* gen() {console.log(1)
}// 定義迭代器對象
const iterator = gen()
iterator.next() // 如果不執行這一局代碼,1不會被打印

當 next 方法執行時遇到了 yield 就會停止,直到你再次調用 next 方法。比如像下面這樣:

function* gen() {yield 1console.log('A')yield 2console.log('B')yield 3console.log('C')return 4
}// 定義迭代器對象
const iterator = gen()
iterator.next() // 執行 gen 函數,打印為空,遇到 yield 1 停止執行
iterator.next() // 繼續執行函數,打印 A,遇到 yield 2 停止執行
iterator.next() // 繼續執行函數,打印 B,遇到 yield 3 停止執行
iterator.next() // 繼續執行函數,打印 C

next 方法調用時,它是有返回值的,它的返回值就是 yield 后面的值或函數的返回值。比如下面這個例子:

// 同步代碼
function* gen() {yield 1console.log('A')yield 2console.log('B')yield 3console.log('C')return 4
}// 定義迭代器對象
const iterator = gen()// 異步代碼
console.log(iterator.next()) // 打印為空  next返回 {value:1,done:false}
console.log(iterator.next()) // A  next返回 {value:2,done:false}
console.log(iterator.next()) // B  next返回 {value:3,done:false}
console.log(iterator.next()) // C  next返回 {value:4,done:true},如果函數有return值,最后一個next方法,它的value值為return的值 value:4;如果沒有。值為 undefined

?

js中Generator函數詳解_js generator-CSDN博客

https://www.cnblogs.com/pengnima/p/13051324.html

JS 中的 Generator 有哪些用處? - 知乎

JS中的Generator函數及其應用場景_generator應用場景-CSDN博客

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

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

相關文章

Linux基本指令(下)

目錄 1. less指令 2. head與tail指令 3. find指令 示例 4. grep指令 示例 ?編輯 5. zip/unzip 打包與壓縮 示例 ?編輯 6. tar指令 7. find指令: -name 8. echo指令 9. 時間相關的指令 1.在顯示方面,使用者可以設定欲顯示的格式&#xff…

分布式ID(6):Redis實現分布式ID生成

Redis是一個高性能的鍵值數據庫,它可以用于生成分布式唯一標識符。需要注意的是Redis實現ID可以用,這也是很多公司的選擇。但是在redis服務器宕機的情況下,他也可能會出現重復生成ID的情況。 1 實現原理 利用Redis的原子操作:Redis提供了原子性的INCR和INCRBY命令,可用于…

使用python或AI自動分析數據關聯(簡介)

有一些Python庫可以幫助用戶自動發現數據集中的關聯關系。通常這類方法被稱為關聯分析或關聯規則挖掘,其中最著名的算法是Apriori和FP-Growth。 兩個算法 Apriori算法: 這是一個用于頻繁項集挖掘和關聯規則學習的經典算法。Python中的mlxtend庫提供了一…

【機器學習】有監督學習算法之:K最近鄰

K最近鄰 1、引言2、決策樹2.1 定義2.2 原理2.3 實現方式2.3.1 距離度量2.3.2 K值的選擇 2.4 算法公式2.5 代碼示例 3、總結 1、引言 小屌絲:魚哥, 這么長時間沒更新了,是不是得抓緊時間了。 小魚:最近可都是在忙的呢,…

已解決ResponseEntityException的Spring MVC異常響應實體異常的正確解決方法,親測有效!!!

由于ResponseEntityException并非Spring框架中明確定義的異常類,我推斷這里可能指的是在使用ResponseEntity時遇到的常見異常或錯誤。因此,我將根據這個假設,提供一個解決Spring MVC中與ResponseEntity相關異常的通用方法指南。 目錄 問題分…

線上歷史館藏系統 Java+SpringBoot+Vue+MySQL

??計算機編程指導師 ??個人介紹:自己非常喜歡研究技術問題!專業做Java、Python、微信小程序、安卓、大數據、爬蟲、Golang、大屏等實戰項目。 ??實戰項目:有源碼或者技術上的問題歡迎在評論區一起討論交流! ?? Java實戰 |…

day09_商品管理訂單管理SpringTaskEcharts

文章目錄 1 商品管理1.1 添加功能1.1.1 需求說明1.1.2 核心概念SPUSKU 1.1.3 加載品牌數據CategoryBrandControllerCategoryBrandServiceCategoryBrandMapperCategoryBrandMapper.xml 1.1.4 加載商品單元數據ProductUnitProductUnitControllerProductUnitServiceProductUnitMap…

詳解java中的Lambda表達式

Lambda表達式的前世今生(來歷與概述) Lambda表達式的前世------匿名類 以往,使用單一抽象方法的接口被用作函數類型。 它們的實例表示函數(functions)或行動(actions)。 自從 JDK 1.1 于 1997…

【MySQL】超詳細-基礎操作

數據庫定義 數據庫是一類軟件,用來管理數據,組織數據; 關系型數據庫MySQL(Oracle,SQL Server,SQLite)以表格形式組織數據,數據格式要求嚴格;非關系型數據庫Redis(MongoDB,HBase&…

數據結構與算法-冒泡排序

引言 在數據結構與算法的世界里,冒泡排序作為基礎排序算法之一,以其直觀易懂的原理和實現方式,為理解更復雜的數據處理邏輯提供了堅實的入門階梯。盡管在實際應用中由于其效率問題不常被用于大規模數據的排序任務,但它對于每一位初…

【C++】set、multiset與map、multimap的使用

目錄 一、關聯式容器二、鍵值對三、樹形結構的關聯式容器3.1 set3.1.1 模板參數列表3.1.2 構造3.1.3 迭代器3.1.4 容量3.1.5 修改操作 3.2 multiset3.3 map3.3.1 模板參數列表3.3.2 構造3.3.3 迭代器3.3.4 容量3.3.5 修改操作3.3.6 operator[] 3.4 multimap 一、關聯式容器 談…

Hololens 2應用開發系列(1)——使用MRTK在Unity中設置混合現實場景并進行程序模擬

Hololens 2應用開發系列(1)——使用MRTK在Unity中進行程序模擬 一、前言二、創建和設置MR場景三、MRTK輸入模擬的開啟 一、前言 在前面的文章中,我介紹了Hololens 2開發環境搭建和項目生成部署等相關內容,使我們能生成一個簡單Ho…

Redis 之九:Spring Data Redis -- Redis Template 用法

SpringData Redis Spring Data Redis 是 Spring Data 項目的一部分,它為 Java 應用程序提供了一種便捷的方式來與 Redis 數據庫進行交互。 Spring Data Redis 提供了對 Redis 的抽象封裝,使得開發者能夠以面向對象的方式操作 Redis,并簡化了 …

matlab 寫入格式化文本文件

目錄 一、save函數 二、fprintf函數 matlab 寫入文本文件可以使用save和fprintf函數 save輸出結果: fprintf輸出結果: 1.23, 2.34, 3.45 4.56, 5.67, 6.78 7.89, 8.90, 9.01 可以看出fprintf輸出結果更加人性化,符合要求,下面分別介紹。 一、save函數 …

linux系統Jenkins工具介紹

Jenkins概念介紹 Jenkins概念Jenkins目的特性產品發布流程 Jenkins概念 Jenkins是一個功能強大的應用程序,允許持續集成和持續交付項目,無論用的是什么平臺。這是一個免費的源代碼,可以處理任何類型的構建或持續集成。集成Jenkins可以用于一些…

MQL5-MT5連接上國內期貨

主要原因是昨天在學習MACD時發現給的基礎代碼感覺不對,但無法證明,因為MT5接的都是外匯交易,數據和國內的文華啥的全對不上,便找了一些國內接CTP的,直接寫代碼有點麻煩,雖然之前對接過國內CTP的東西&#x…

AI入門筆記(三)

神經網絡是如何工作的 神經網絡又是如何工作的呢?我們用一個例子來解釋。我們看下面這張圖片,我們要識別出這些圖片都是0并不難,要怎么交給計算機,讓計算機和我們得出同樣的結果?難點就在于模式識別的答案不標準&…

十二、Nacos源碼系列:Nacos配置中心原理(四)- RefreshEvent 事件處理

前面文章,我們說到回調監聽器的方法中,主要就是發布了一個RefreshEvent事件,這個事件主要由 SpringCloud 相關類來處理。今天我們繼續分析后續的流程。 RefreshEvent 事件會由 RefreshEventListener 來處理,該 listener 含有一個 …

Object類方法

toString(): 返回對象的字符串表示形式。默認情況下,返回對象的類名和哈希碼的十六進制表示。 equals(Object obj): 比較兩個對象是否相等。默認情況下,這個方法比較的是兩個對象的引用是否相同,但是通常會在子類中重寫這個方法以實現自定義…

武器大師——操作符詳解(下)

目錄 六、單目操作符 七、逗號表達式 八、下標引用以及函數調用 8.1.下標引用 8.2.函數調用 九、結構體 9.1.結構體 9.1.1結構的聲明 9.1.2結構體的定義和初始化 9.2.結構成員訪問操作符 9.2.1直接訪問 9.2.2間接訪問 十、操作符的屬性 10.1.優先性 10.2.結合性 …