Promise完全體總結

? ? ? ? 我們在上篇文章提到了異步會導致無法通過返回值來獲取函數的執行結果,我們通過傳入一個回調函數的方式,以參數的形式獲取到了我們想要獲取的數據,但是這樣如果需要對數據進行多次操作導致形成回調地獄那種不便于閱讀以及護理的代碼。

? ? ? ? 為了解決這個問題Promise(承諾)作為一個存儲數據的容器,幫助我們解決需要用回調函數的參數獲取異步函數執行結果的問題,擁有著一套特殊的存儲數據的方式。

1.Promise的介紹

? ? ? ? ? 首先就是創建Promise,我們要認識到Promise是一個構造函數,模擬類,通過new去實例化,Promise是內建的構造函數,本質上就是類,用new得到實例(承諾對象)

? ? ? ? Promise構造函數需要一個函數作為參數,Promise構造函數的回調函數會在創建Promiss時調用,同時會有兩個參數傳遞進去,resolve和reject兩個函數,通過這兩個函數可以向Promise存儲數據,resolve在執行正常的時候存儲數據 reject在執行錯誤的時候存儲數據。

? ? ? ? 當我們想要從Promise中讀取數據的時候,要通過Promise實例方法then去讀取Promise中存儲的數據,then需要兩個回調函數作為參數,resolve存儲的數據會在第一個函數中作為參數返回,reject存儲的數據或者丟出的錯誤會在第二個函數作為參數返回。

? ? ? ? 代碼如下。

????????

?????????

?????????

?????????

?

? ? ? ? Promise還隱藏了兩個隱藏屬性 PromiseReault存儲數據還有PromiseState記錄Promise的狀態(三種狀態 fulfilled(完成) rejected(出錯拒絕) pending(正在進行中)),state只能修改一次,修改以后永遠不會更改,state是私有的 reject和reslove只能運行一個。

? ? ? ? Promise的運行流程---

? ? ? ??當Promise創建的時候,PromiseState初始值是pending,當resolve存儲數據時,PromiseState變為fulfilled PromiseResult存儲數據。

????????當reject存儲數據時,PromiseState變為rejected?PromiseResult存儲數據或者異常對象。

? ? ? ? 當我們通過then讀取數據的時候,相當于為Promise設置了回調函數,如果PromiseState變為fulfilled則調用then第一個回調函數返回數據 如果是reject則調用第二個回調函數返回數據。

? ? ? ? catch和then類似,catch()相當于then(null,(reason)=>{})專門處理異常的方法

? ? ? ? finally()也是傳一個回調函數,無論正常存儲數據還是出現異常都會執行。一般用來編寫無論成功與否都需要執行的代碼邏輯。

????????

?2.Promise的詳情?

? ? ? ? 我們現在會使用Promise之后,搞一下原理.Promise就是一個存儲數據的對象,但是存儲方式特殊,所以可以直接將異步調用的結果存儲到Promise中。?

const Promise = new Promise((resolve,reject)=>{})

? ? ? ? 這句代碼中Promise里面的函數是我們傳進去的,resolve和reject是作為參數給我們返回的。所以我們定義這個函數就是為了讓Promise把resolbe和reject這兩個函數傳過來。然后resolve和reject存儲數據。

? ? ? ? 我們現在回歸正題,用promise去解決我們的回調地獄問題。

function sum(a,b,cb){setTimeout(()=>{cb(a+b)},1000)
}
const result=sum(1,1,(result)=>{sum(result,1,(result)=>{sum(result,1,(result)=>{sum(result,1,(result)=>{console.log(result);})})})
})

? ? ? 這是我們最開始沒有Promise的回調地獄。

? ? ? ?我們現在希望通過Promise去改進代碼。但是這時候我們發現我們好像欠缺了點東西。我們雖然存儲數據了但是我們想要實現多次調用還是需要一直調用

????????

? ? ? ? 這好像也是回調函數。

? ? ? ? 現在添加一個新知識點。Promise中的then和catch方法的返回值都會存儲到新的Promise中。這樣我們就知道如何去避免回調地獄了。

function sum1(a,b){return new Promise((resolve,reject)=>{setTimeout(()=>{resolve(a+b)},1000)})
}
const p1 =sum1(1,1).then((result)=>{return '楚河日當午'
})
const p3 = p1.then((result)=>{console.log(result);return 'gogogo'
})
p3.then((result)=>{console.log(result);
})
setTimeout(()=>{console.log('p1',p1)
},1000)//

? ? ? ? 我們可以第一個then返回一些數據然后賦值給一個變量,我們記得返回的是一個new Promise

然后PromiseResult就是我們的返回值,我們就可以再次通過then去獲取最新的值,就可以實現每次then都可以獲取到最新的值。

?????????

這樣就解決了我們的回調地獄這個問題,現在我們來看我們的catch方法。

?????????

? ? ? ? 我們發現在我們對Promise實例進行鏈式調用的時候,后面的方法thencatch讀取上一步的執行結果如果上一步的執行結果不是我們當前想要的,就會跳過當前的方法。

? ? ? ? 還有如果我們丟出錯誤沒有用catch捕獲就會報錯。(Promise調用鏈沒有catch卻扔出錯誤)

?????????

?

? ? ? ? Promise是甩鍋對象,如果catch出錯了會直接拋出錯誤,需要用catch捕獲。通常情況下catch寫最后面就不用這樣連續用了。相當于保安

????????

?????????

????????這里是一些擴展的方法以及使用方式。不常用。

? ? ? ? 這就是Promise的使用了,當然想要深度理解還需要去分清楚異步的執行順序宏任務和微任務,以及手寫Promise。如果僅僅是知道怎么去用,這就已經足夠了

?????????

?

????????

?????????

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

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

相關文章

SpringJDBC源碼初探-DataSource類

一、DataSource接口核心作用 DataSource是JDBC規范的核心接口,位于javax.sql包中,用于替代傳統的DriverManager獲取數據庫連接。Spring框架通過org.springframework.jdbc.datasource包對該接口進行了增強,提供連接池管理、事務綁定等高級特性…

C語言(08)——關于指針(逐漸清晰版)

為了更好地理解本篇文章的知識內容,讀者可以將以下文章作為補充知識進行閱讀 : C語言————原碼 補碼 反碼 (超絕詳細解釋)-CSDN博客 C語言————二、八、十、十六進制的相互轉換-CSDN博客 C語言————斐波那契數列的理解…

LeetCode 1616.分割兩個字符串得到回文串

給你兩個字符串 a 和 b ,它們長度相同。請你選擇一個下標,將兩個字符串都在 相同的下標 分割開。由 a 可以得到兩個字符串: aprefix 和 asuffix ,滿足 a aprefix asuffix ,同理,由 b 可以得到兩個字符串 …

算法【1】

網址:主站 工具補充 1. sort 函數的使用規則 作用:對容器元素進行排序,默認升序。語法:sort(起始迭代器, 結束迭代器, 比較規則) 前兩個參數是排序范圍:[begin, end)(包含begin,不包含end&am…

信創國產Linux操作系統匯總:從桌面到服務器,百花齊放

在數字化浪潮席卷全球的今天,操作系統作為信息產業的基石,其戰略地位日益凸顯。曾經由國外巨頭壟斷的格局正悄然改變——中國本土Linux操作系統歷經多年沉淀,已形成了百花齊放的局面。無論是日常辦公、專業開發,還是關鍵行業應用&…

claudia for claude code

一.安裝所有必需的依賴項 1.安裝 Git for Windows 步驟: 訪問 Git 的官方網站 git-scm.com。 下載適用于 Windows 的最新版本安裝程序。 運行安裝程序。在安裝向導的各個步驟中,建議保留所有默認設置,這些設置對于本指南的后續操作已經足夠。 驗證…

企業內外網文件安全傳輸解決方案

企業內外網文件安全傳輸解決方案 基于零信任架構的智能中轉系統設計 一、業務背景與挑戰分析 1.1 企業網絡安全現狀 在數字化轉型浪潮下,企業面臨著前所未有的安全挑戰。傳統的"城墻式"網絡防護已無法滿足現代企業靈活協作的需求。根據《2024年中國企業…

《HCIA-Datacom 認證》希賽三色筆記:詳解 VLAN 間通信的 3 種實現方式

標記說明:■掌握內容 ■次重點 ■理解內容 在局域網部署中,VLAN 技術通過隔離廣播域提升了網絡安全性和穩定性,但不同 VLAN 間的通信需求又成了新的難題。比如財務部門的電腦(VLAN 10)需要訪問服務…

Windows 10 系統下的編程字體安裝與配置(VSCode)教程

Windows 10 系統下的編程字體安裝與配置教程 常見的優秀編程字體 開發者社區中有許多備受推崇的編程字體,它們都致力于提升代碼的可讀性和舒適度。以下是一些常見的選擇: Fira Code: 以其豐富的編程連字(ligatures)而聞名&…

ITIL 4 高速IT:解耦架構——構建快速迭代的技術基座

一、為什么要解耦:從“架構”談到“速度”1.高速IT的真正瓶頸:不是能力,而是架構在我們深入學習ITIL 4 高速IT的時候,大家可能都會有個疑問:為什么有些組織在數字化轉型過程中推得動,有些卻始終難以突破&am…

網絡協議——MPLS(多協議標簽轉發)

一,基本概述1. mpls基本概念MPLS位于二三層之間,可以向所有網絡層提供服務。通過在數據鏈路層和網絡層之間增加額外的MPLS頭部,基于MPLS頭部實現數據快速轉發。2. 控制平面和轉發平面控制平面:負責產生和維護路由信息以及標簽信息…

影刀RPA_初級課程_玩轉影刀自動化_EXCEL操作自動化

聲明:相關內容來自影刀學院,本文章為自用筆記,切勿商用!(若有侵權,請聯絡刪除) 1. 數據的表達 1.1 列表 1.1 獲取一段字符(字符串列表的截取 —— 前開后閉) 1.2 獲取長…

當貝純凈版_海信ip811n海思mv320處理器安卓4.42及9.0主板優盤免拆刷機固件及教程

海信IP811N安卓4.4.2及安卓9.0主板免拆升級教程 下載固件之前,請拆機確認下主板處理器是否為 海思hi3798mv320處理器,拆機將主板上 位于中心位置的CPU芯片上的黑色貼紙取下 然后查看芯片第二行是否有V32字樣,如下圖 然后進入機頂盒設置&a…

三、平衡橋電路

一、電路結構 由于平衡橋后要連接雙T型橋逆變電路并聯,這里采用平衡橋電路來穩定母線和中線的電壓平衡,使正母線電壓BUS和負母線電壓BUS-相對于中線的電壓大小相等,極性相反,如50VBUS,-50BUS-。 平衡橋電路由兩個電容…

Java-85 深入淺出 MySQL InnoDB 存儲結構:Buffer Pool、寫緩沖與日志機制全解

點一下關注吧!!!非常感謝!!持續更新!!! 🚀 AI篇持續更新中!(長期更新) AI煉丹日志-30-新發布【1T 萬億】參數量大模型!Kim…

Linux救援模式之應用篇

掛載并訪問文件系統1. 首先識別分區 fdisk -l # 查看所有磁盤和分區 lsblk # 以樹狀結構查看塊設備 blkid # 查看分區的UUID和文件系統類型2. 創建掛載點并掛載分區 mkdir /mnt/rescue # 創建掛載點# 掛載根分區(根據你實際的根分區設備) mount /dev/…

【學習路線】游戲開發大師之路:從編程基礎到獨立游戲制作

前言 游戲開發是一個充滿創意和技術挑戰的領域,它融合了編程、美術、音效、設計等多個學科。隨著游戲產業的蓬勃發展,游戲開發已成為最具吸引力的技術職業之一。本文將為您提供一條從零基礎到游戲開發大師的完整學習路線,涵蓋編程基礎、游戲引…

宇樹 G1 部署(九)——遙操作控制腳本 teleop_hand_and_arm.py 分析與測試部署

首先,我使用的是 v1.0 版本,宇樹最近發力了更新的很快:xr_teleoperate-1.0 teleop_hand_and_arm.py 支持通過 XR 設備(比如手勢或手柄)來控制實際機器人動作,也支持在虛擬仿真中運行。可以根據需要&#x…

第十一天:不定方程求解

每日一道C題:不定方程求解 問題:給定正整數a,b,c。求不定方程 axbyc 關于未知數x和y的所有非負整數解組數。 要求:輸入一行,包含三個正整數a,b,c,兩個整數之間用單個空格…

ElasticStack技術棧概述及Elasticsearch8.2.2集群部署并更換JDK版本為openjdk-17

ElasticStack 一、引言 在當今數據驅動的時代,如何高效地收集、處理和分析日志及其他類型的數據,已成為企業構建可觀測性和運維能力的重要課題。Elastic Stack(早期稱為 ELK Stack)是一套由 Elastic 公司推出的開源技術棧&#xf…