ES6 Promise 狀態機

狀態機:抽象的計算模型,根據特定的條件或者信號切換不同的狀態

一、Promise 是什么?

簡單來說,Promise 就是一個“承諾對象”。在ES6 里,有些代碼執行起來需要點時間,比如加載文件、等待網絡請求或者設置定時器,這些代碼被叫做“生產代碼”;而另外一些代碼得等著生產代碼出結果才能執行,這就是“消費代碼”。Promise 就像一座橋,把生產代碼和消費代碼連接起來。

它本身包含了生產代碼,還會調用消費代碼。Promise 有三種狀態:

  • pending(進行中):就像任務還在執行中,結果還沒出來。
  • fulfilled(已完成):任務成功完成,有了一個結果值。
  • rejected(已拒絕):任務出錯了,得到一個錯誤對象。

不過呢,咱們不能直接去訪問 Promise 的狀態(state)和結果(result),得通過它的方法來處理。

二、Promise 怎么用?

(一)基本語法

創建一個 Promise 得用 new Promise(),里面傳一個函數,這個函數有兩個參數,myResolvemyReject

let promise = new Promise(function(resolve, reject) {// 生產代碼if (/* 條件滿足,任務成功 */) {resolve("成功啦!"); // 成功時調用} else {reject("出錯咯!"); // 失敗時調用}
});

(二)處理結果

.then() 來處理 Promise 的結果,它可以接收兩個函數:

  • 第一個函數是任務成功時執行的。
  • 第二個函數是任務失敗時執行的。這兩個函數都是可選的,你可以只寫成功的或者只寫失敗的處理函數。
promise.then(function(value) { /* 成功了咋處理 */ },function(error) { /* 失敗了咋處理 */ }
);

(三)舉個栗子

比如,我們用 Promise 來模擬一個 3 秒后的定時器:

function showMessage(some) {document.getElementById("demo").innerHTML = some;
}let promise = new Promise(function(resolve, reject) {let x = 0;if (x == 0) {resolve("OK"); // x 等于 0,任務成功} else {reject("Error"); // x 不等于 0,任務失敗}
});promise.then(function(value) { showMessage(value); }, // 成功時顯示 "OK"function(error) { showMessage(error); } // 失敗時顯示 "Error"
);

再比如,用 Promise 來處理文件請求:

let promise = new Promise(function(resolve, reject) {let req = new XMLHttpRequest();req.open('GET', "xxx.html");req.onload = function() {if (req.status == 200) {resolve(req.response); // 請求成功,返回文件內容} else {reject("File not Found"); // 請求失敗,返回錯誤信息}};req.send();
});promise.then(function(value) { showMessage(value); }, // 成功時顯示文件內容function(error) { showMessage(error); } // 失敗時顯示錯誤信息
);

三、什么時候該用 Promise?

當你遇到以下情況時,就可以考慮用 Promise 啦:

  • 需要處理異步操作:像定時器 setTimeout、網絡請求(AJAX)、文件讀取這些操作,都是異步的,不會阻塞代碼執行,這時候用 Promise 能讓代碼更清晰。
  • 避免回調地獄:如果有多個異步操作需要按順序執行,用傳統的回調函數可能會寫成嵌套的形式,代碼看起來像個“地獄”,而 Promise 可以通過鏈式調用讓代碼更有條理。
  • 統一處理成功和失敗:不管異步操作是成功還是失敗,都可以通過 .then() 或者 .catch() 來統一處理結果,讓代碼更簡潔。

四、Promise 原理是

Promise 的核心原理其實就是狀態機:

  1. 一開始,Promise 處于 pending 狀態,這時候生產代碼在執行。
  2. 當生產代碼執行成功,就會調用 myResolve(),Promise 狀態變成 fulfilled,然后執行 .then() 里的成功回調函數。
  3. 要是生產代碼執行出錯,就會調用 myReject(),Promise 狀態變成 rejected,接著執行 .then() 里的失敗回調函數。

而且,Promise 的狀態一旦改變,就不會再變了。也就是說,一旦變成 fulfilled 或者 rejected,就定格在這個狀態了,這樣可以避免重復處理結果。

Promise 是 ES6(ECMAScript 2015)引入的特性,現在主流的瀏覽器基本都支持,比如 Chrome 33 及以上、Firefox 29 及以上等等,所以不用擔心兼容性問題,可以放心用起來啦!

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

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

相關文章

【Docker管理工具】部署Docker可視化管理面板Dpanel

【Docker管理工具】部署Docker可視化管理面板Dpanel 一、Dpanel介紹1.1 DPanel 簡介1.2 主要特點 二、本次實踐規劃2.1 本地環境規劃2.2 本次實踐介紹 三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版本3.3 檢查docker compose 版本 四、下載Dpanel鏡像五、部署Dpanel…

最新研究揭示云端大語言模型防護機制的成效與缺陷

一項全面新研究揭露了主流云端大語言模型(LLM)平臺安全機制存在重大漏洞與不一致性,對當前人工智能安全基礎設施現狀敲響警鐘。該研究評估了三大領先生成式AI平臺的內容過濾和提示注入防御效果,揭示了安全措施在阻止有害內容生成與…

docker中,容器時間和宿機主機時間不一致問題

win11下的docker中有個mysql。今天發現插入數據的時間不正確。后來發現原來是docker容器中的時間不正確。于是嘗試了各種修改,什么run -e TZ"${tzutil /g}",TZ"Asia/Shanghai",還有初始化時帶--mysqld一類的,…

uniapp實現的簡約美觀的星級評分組件

采用 uniapp 實現的一款簡約美觀的星級評分模板,提供絲滑動畫效果,用戶可根據自身需求進行自定義修改、擴展,純CSS、HTML實現,支持web、H5、微信小程序(其他小程序請自行測試) 可到插件市場下載嘗試&#x…

go語言的鎖

本篇文章主要講鎖,主要會涉及go的sync.Mutex和sync.RWMutex。 一.鎖的概念和發展 1.1 鎖的概念 所謂的加鎖和解鎖其實就是指一個數據是否被占用了,通過Mutex內的一個狀態來表示。 例如,取 0 表示未加鎖,1 表示已加鎖&#xff…

Ubuntu 服務器軟件更新,以及常用軟件安裝 —— 一步一步配置 Ubuntu Server 的 NodeJS 服務器詳細實錄 3

前言 前面,我們已經 安裝好了 Ubuntu 服務器系統,并且 配置好了 ssh 免密登錄服務器 ,現在,我們要來進一步的設置服務器。 那么,本文,就是進行服務器的系統更新,以及常用軟件的安裝 調整 Ubu…

如何從零開始建設一個網站?

當你沒有建站的基礎和建站的知識,那么應該如何開展網站建設和網站管理。而今天的教程是不管你是為自己建站還是為他人建站都適合的。本教程會指導你如何進入建站,將建站的步驟給大家分解: 首先我們了解一下,建站需要那些步驟和流程…

網絡可靠性的定義與核心要素

網絡可靠性(Network Reliability)是指網絡系統在特定時間范圍內持續提供穩定、無中斷、符合預期性能的服務能力。其核心目標是確保數據能夠準確、完整、及時地傳輸,即使在部分故障或異常情況下仍能維持基本功能。 1. 網絡可靠性的核心指標 衡…

GpuGeek如何成為AI基礎設施市場的中堅力量

AI時代,算力基礎設施已成為支撐技術創新和產業升級的關鍵要素。作為國內專注服務算法工程師群體的智算平臺,GpuGeek通過持續創新的服務模式、精準的市場定位和系統化的生態建設,正快速成長為AI基礎設施領域的中堅力量。本文將深入分析GpuGeek…

【Qt】Bug:findChildren找不到控件

使用正確的父對象調用 findChildren:不要在布局對象上調用 findChildren,而應該在布局所在的窗口或控件上調用。

【Linux網絡編程】傳輸層協議TCP,UDP

目錄 一,UDP協議 1,UDP協議的格式 2,UDP的特點 3,面向數據報 4,UDP的緩沖區 5,UDP使用注意事項 6,基于UDP的應用層協議 二,對于報文的理解 三,TCP協議 1&…

Neo4j 數據可視化與洞察獲取:原理、技術與實踐指南

在關系密集型數據的分析領域,Neo4j 憑借其強大的圖數據模型脫穎而出。然而,將復雜的連接關系轉化為直觀見解,需要專業的數據可視化技術和分析方法。本文將深入探討 Neo4j 數據可視化的核心原理、關鍵技術、實用技巧以及結合圖數據科學庫(GDS)獲取深度洞察的最佳實踐。 Ne…

樹莓派超全系列教程文檔--(55)如何使用網絡文件系統NFS

如何使用網絡文件系統NFS 網絡文件系統 (NFS)設置基本 NFS 服務器Portmap 鎖定(可選) 配置 NFS 客戶端端口映射鎖定(可選) 配置復雜的 NFS 服務器組權限DNS(可選,僅在使用 DNS 時)NIS&#xff0…

無法運用pytorch環境、改環境路徑、隔離環境

一.未建虛擬環境時 1.創建新項目后,直接運行是這樣的。 2.設置中Virtualenv找不到pytorch環境?因為此時沒有創建新虛擬環境。 3.選擇conda環境(全局環境)時,是可以下載環境的。 運行結果如下: 是全局環境…

HTML5+CSS3+JS小實例:具有粘性重力的磨砂玻璃導航欄

實例:具有粘性重力的磨砂玻璃導航欄 技術棧:HTML+CSS+JS 效果: 源碼: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width…

NodeJS全棧WEB3面試題——P8項目實戰類問題(偏全棧)

&#x1f4e6; 8.1 請描述你做過的 Web3 項目&#xff0c;具體技術棧和你負責的模塊&#xff1f; 我主導開發過一個基于 NFT 的數字紀念平臺&#xff0c;用戶可以上傳照片并生成獨特的紀念 NFT&#xff0c;結合 IPFS 和 ERC-721 實現永存上鏈。 &#x1f527; 技術棧&#xf…

3-10單元格行、列號獲取(實例:表格選與維度轉換)學習筆記

************************************************************************************************************** 點擊進入 -我要自學網-國內領先的專業視頻教程學習網站 *******************************************************************************************…

AI問答-vue3+ts+vite:http://www.abc.com:3022/m-abc-pc/#/snow 這樣的項目 在服務器怎么部署

為什么記錄有子路徑項目的部署&#xff0c;因為&#xff0c;通過子路徑可以區分項目&#xff0c;那么也就可以實現微前端架構&#xff0c;并且具有獨特優勢&#xff0c;每個項目都是絕對隔離的。 要將 Vue3 項目&#xff08;如路徑為 http://www.abc.com:3022/m-saas-pc/#/sno…

PostgreSQL-基于PgSQL17和11版本導出所有的超表建表語句

最新版本更新 https://code.jiangjiesheng.cn/article/368?fromcsdn 推薦 《高并發 & 微服務 & 性能調優實戰案例100講 源碼下載》 1. 基于pgsql 17.4 研究 查詢psql版本&#xff1a;SELECT version(); 查看已知1條建表語句和db中數據關系 SELECT create_hypert…

世事無常,比較復雜,人可以簡單一點

2025年6月5日日&#xff0c;17~28℃&#xff0c;一般 待辦&#xff1a; 宣講會 職稱材料的最后檢查 職稱材料有錯誤&#xff0c;需要修改 期末考試試題啟用 教學技能大賽PPT 遇見&#xff1a;部門宣傳泰國博士項目、碩士項目、本科項目。 感受或反思&#xff1a;東南亞博士…