【JavaScript】JavaScript Promises實踐指南

【JavaScript】JavaScript Promises實踐指南

在這里插入圖片描述

你了解JavaScript中的Promises嗎?這是一個很多人一開始就放棄的主題,但我會盡量讓它變得盡可能簡單。

1. “Promise”到底是什么?

“Promise”是異步編程中的一個基本概念,特別是在JavaScript和許多現代編程語言中。它代表一個可能尚未可用但將在未來某個時刻解決的值(或操作的結果), either successfully with a value or unsuccessfully with an error.

2. Promise的狀態:

在JavaScript中,Promise可以處于以下三種狀態之一:

  1. Pending(進行中): 這是Promise創建時的初始狀態。它表示由Promise代表的異步操作尚未完成,結果(履行或拒絕)不可用。Promises從這種狀態開始,然后過渡到其他狀態之一。
  2. Fulfilled(履行): 這個狀態表示異步操作成功完成。當Promise過渡到履行狀態時,意味著操作已成功完成,結果(值或數據)可用。您可以使用.then()方法訪問解決的值。
  3. Rejected(拒絕): 這個狀態表示異步操作失敗。當Promise過渡到拒絕狀態時,意味著操作過程中發生了錯誤或異常。您可以使用.catch()方法或.then()方法的第二個參數訪問拒絕的原因(錯誤對象或消息)并處理它。

以下是Promise狀態和轉換的直觀表示:

初始狀態:         進行中/           \   
履行狀態:       履行          拒絕(結果可用)    (發生錯誤)

Promises的設計旨在提供一種結構化的方式來處理異步操作,允許您分別處理成功和失敗情況。您可以使用.then()指定Promise履行時要做的事情,使用.catch()處理Promise拒絕時的錯誤。這使異步代碼比基于回調的方法更易于管理和閱讀。

3. 如何構建一個Promise

在JavaScript中構建Promise,可以使用Promise構造函數,它接受一個單一函數作為參數。這個函數被稱為執行器函數,它有兩個參數:resolverejectresolve函數用于用值履行Promise,reject函數用于用錯誤拒絕Promise。

以下是創建Promise的基本結構:

const myPromise = new Promise((resolve, reject) => {// 異步或耗時操作在這里進行// 通常,您會執行一些異步任務,比如獲取數據或讀取文件// 如果操作成功,調用resolve并傳入結果// resolve(result);// 如果發生錯誤,調用reject并傳入錯誤對象或消息// reject(error);
});

以下是一個更具體的示例,使用setTimeout模擬延遲的異步操作,并在一定時間后解決Promise:

const delay = (milliseconds) => {return new Promise((resolve, reject) => {setTimeout(() => {resolve(`${milliseconds}毫秒后解決`);}, milliseconds);});
};// 使用:
delay(2000) // 等待2秒.then((result) => {console.log(result); // 在2000毫秒后解決}).catch((error) => {console.error(error);});

在這個示例中:

  1. 我們定義了一個返回Promise的函數delay。在Promise構造函數內部,我們使用setTimeout模擬異步延遲。
  2. 如果異步操作成功(即setTimeout完成),我們調用resolve并傳入結果。
  3. 如果操作過程中發生錯誤,我們可以調用reject并傳入錯誤對象或消息。
  4. 我們使用.then()指定Promise履行(解決)時要做的事情,使用.catch()處理可能發生的任何錯誤。

這是一個簡單的示例,但在實踐中,您會用真實的異步操作(如發起API請求或讀取文件)替換setTimeout。Promises提供了一種結構化的方式來處理異步代碼,使其更易于閱讀和維護。

3.1. Promise解決時返回值

在JavaScript Promises中,您可以通過在Promise的執行器函數內將解決的值作為參數提供給resolve函數來在Promise解決時返回值。以下是操作方法:

const myPromise = new Promise((resolve, reject) => {// 模擬成功的異步操作setTimeout(() => {const result = '這是解決的值';resolve(result); // 用結果解決Promise}, 2000);
});// 使用Promise來訪問解決的值
myPromise.then((result) => {console.log('解決:', result); // 解決: 這是解決的值}).catch((error) => {console.error('錯誤:', error);});

在這個例子中:

  1. 在Promise的執行器函數內部,我們使用setTimeout模擬異步操作。
  2. 當異步操作成功完成時,我們調用resolve(result)并傳入期望的解決值(在這個例子中是'這是解決的值')。
  3. 當你使用.then()來處理Promise的解決時,解決的值作為參數傳遞給回調函數。你可以在那個回調函數內訪問和使用解決的值。

result變量包含解決的值,你可以在.then()回調中根據需要使用它。

這種模式允許你以結構化和清晰的方式處理異步操作的結果。解決的值可以是任何數據類型,包括字符串、數字、對象,甚至是其他Promise。

3.2. Promise被拒絕時返回錯誤

在JavaScript Promises中,你可以通過在Promise的執行器函數內將錯誤消息或錯誤對象作為參數提供給reject函數來在Promise被拒絕時返回錯誤。以下是操作方法:

const myPromise = new Promise((resolve, reject) => {// 模擬失敗的異步操作setTimeout(() => {const errorMessage = '這是錯誤消息';reject(errorMessage); // 用錯誤消息拒絕Promise}, 2000);
});// 使用Promise來處理拒絕和錯誤
myPromise.then((result) => {console.log('解決:', result);}).catch((error) => {console.error('錯誤:', error); // 錯誤: 這是錯誤消息});

在這個例子中:

  1. 在Promise的執行器函數內部,我們使用setTimeout模擬失敗的異步操作。
  2. 當異步操作遇到錯誤時,我們調用reject(errorMessage)并傳入期望的錯誤消息(在這個例子中是'這是錯誤消息')。
  3. 當你使用.catch()來處理Promise的拒絕時,拒絕的錯誤作為參數傳遞給回調函數。你可以在那個回調函數內訪問和使用錯誤消息或錯誤對象。

error變量包含拒絕的錯誤,你可以根據需要處理和記錄它,或執行任何其他錯誤處理任務。

這種模式允許你使用Promises優雅地處理可能在異步操作中發生的錯誤。拒絕的值可以是錯誤消息字符串、錯誤對象,或任何代表拒絕原因的其他值。

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

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

相關文章

計算機視覺總結

以下是針對上述問題的詳細解答,并結合代碼示例進行說明: 1. 改進YOLOv5人臉檢測模塊,復雜光照場景準確率從98.2%提升至99.5% 優化具體過程: 光照補償:在數據預處理階段,采用自適應光照補償算法,對圖像進行實時增強,以減少光照變化對人臉檢測的影響。數據增強:在訓練…

ExpTimerApcRoutine函數分析之作用是ActiveTimerListHead里面移除定時器_etimer

第一部分: VOID ExpTimerApcRoutine ( IN PKAPC Apc, IN PKNORMAL_ROUTINE *NormalRoutine, IN PVOID *NormalContext, IN PVOID *SystemArgument1, IN PVOID *SystemArgument2 ) /* Routine Description: This function is the special …

算法分析與設計 專題三

目錄 一、實驗目的 二、實驗內容 三、問題分析與求解 四、AC源代碼、截圖 五、實驗小結 一、實驗目的 1、了解貪心算法的分析過程,學會用貪心算法解決一些具體的問題。 2、了解廣度優先算法和深度優先算法。 二、實驗內容 1992 當然,我們的收藏中…

1688商品詳情接口:深度解析與應用實踐

在電商領域,1688作為中國領先的B2B平臺,擁有海量的商品信息。對于開發者、商家和數據分析師來說,獲取1688商品的詳細信息是實現數據分析、競品研究、自動化管理和精準營銷的重要手段。本文將詳細介紹1688商品詳情接口的使用方法、技術細節以及…

每日算法-250328

記錄今天學習和解決的LeetCode算法題。 92. 反轉鏈表 II 題目 思路 本題要求反轉鏈表中從 left 到 right 位置的節點。我們可以采用 頭插法 的思路來反轉指定區間的鏈表。 具體來說,我們首先定位到 left 位置節點的前一個節點 prev。然后,從 left 位置…

C語言中的位域:節省內存的標志位管理技術

位域(Bit-field) 是 C 語言中的一種特性,允許在結構體(struct)中定義占用特定位數的成員變量。通過位域,可以更精細地控制內存的使用,尤其是在需要存儲多個布爾值或小范圍整數時,可以…

【AI編程學習之Python】第一天:Python的介紹

Python介紹 簡介 Python是一種解釋型、面向對象的語言。由吉多范羅蘇姆(Guido van Rossum)于1989年發明,1991年正式公布。官網:www.python.org Python單詞是"大蟒蛇”的意思。但是龜叔不是喜歡蟒蛇才起這個名字,而是正在追劇:英國電視喜劇片《蒙提派森的飛行馬戲團》(Mo…

【openstack系列】虛擬化技術

OpenStack 是一個開源的云計算管理平臺,它本身并不直接提供虛擬化技術,而是通過集成不同的虛擬化解決方案來管理和編排計算、存儲和網絡資源。OpenStack 的核心優勢在于其靈活性和可擴展性,支持多種虛擬化技術(Hypervisor),使企業可以根據需求選擇合適的底層虛擬化方案。…

保姆級教程:Vue3 + Django + MySQL 前后端聯調(PyCharm+VSCode版)

一、環境準備與驗證 這里為減少篇幅,默認大家都安裝好了這些軟件。不會下載安裝的,教程也很多,這里不再做贅述。話不多說,咱們開始: 1. 安裝驗證 確保已安裝以下軟件并驗證版本: # 驗證Node.js node -v…

Spring Data審計利器:@LastModifiedDate詳解!!!

🕒 Spring Data審計利器:LastModifiedDate詳解🔥 🌟 簡介 在數據驅動的應用中,記錄數據的最后修改時間是常見需求。Spring Data的LastModifiedDate注解讓這一過程自動化成為可能!本篇帶你掌握它的核心用法…

洛谷題單1-P1001 A+B Problem-python-流程圖重構

題目描述 輸入兩個整數 a,b,輸出它們的和(∣a∣,∣b∣≤109)。 輸入格式 兩個以空格分開的整數。 輸出格式 一個整數。 輸入輸出樣例 輸入 20 30輸出 50方式-print class Solution:staticmethoddef oi_input():"""從…

CCF CSP 第33次(2024.03)(2_相似度計算_C++)(字符串中字母大小寫轉換+哈希集合)

CCF CSP 第33次(2024.03)(2_相似度計算_C) 題目背景:題目描述:輸入格式:輸出格式:樣例1輸入:樣例1輸出:樣例1解釋:樣例2輸入:樣例2輸出…

Windows .gitignore文件不生效的情況排查

概述 今天下班在家里搗騰自己的代碼,在配置.gitignore文件忽略部分文件的時候,發現死活不生效 問題根源 經過一通分析和排查才發現,是.gitignore文件的編碼錯了,剛開始還沒注意到,因為是在Windows下開發&#xff0c…

Uniapp自定義TabBar組件全封裝實踐與疑難問題解決方案

前言 在當前公司小程序項目中,我們遇到了一個具有挑戰性的需求:根據不同用戶身份動態展示差異化的底部導航欄(TabBar) 。這種多角色場景下的UI適配需求,在提升用戶體驗和實現精細化運營方面具有重要意義。 在技術調研…

四川省汽車加氣站操作工備考題庫及答案分享

1.按壓力容器的設計壓力分為( )個壓力等級。 A. 三 B. 四 C. 五 D. 六 答案:B。解析:按壓力容器的設計壓力分為低壓、中壓、高壓、超高壓四個壓力等級。 2.緩沖罐的安裝位置在天然氣壓縮機( )。 A. 出口處 …

2025年- G27-Lc101-542. 01 矩陣--java版

1.題目描述 2.思路 總結:用廣度優先搜索,首先要確定0的位置,不為0的位置,我們要更新的它的值,只能往上下左右尋找跟它最近的0的位置。 解題思路 我們用 BFS(廣度優先搜索)求解,因為 …

CANopen基本理論

目錄 一、CANopen簡介 二、OD對象字典 2.1 OD對象字典簡介 2.2 CANopen預定義連接集 三、PDO過程數據對象 四、SDO過程數據對象 五、特殊協議 5.1 同步協議 5.2 時間戳協議 5.3 緊急報文協議 六、NMT網絡管理 6.1 NMT節點狀態 6.2 NMT節點上線報文 6.3 NMT心跳報…

【Zookeeper搭建】Zookeeper分布式集群搭建完整指南

Zookeeper分布式集群搭建 (一)克隆前準備工作 一、時鐘同步 步驟: 1、輸入date命令可以查看當前系統時間,可以看到此時系統時間為PDT(部分機器或許為EST),并非中國標準時間。我們在中國地區…

MVC基礎概念及相應代碼示例

(舊的)代碼實現方法 一個功能模塊的代碼邏輯(顯示處理,數據處理,邏輯判定)都寫在一起(耦合) (新的)代碼MVC分層實現方法 顯示部分實現(View視圖) 數據處理實…

nginx優化(持續更新!!!)

1.調整文件描述符 # 查看當前系統文件描述符限制 ulimit -n# 永久修改文件描述符限制 # 編輯 /etc/security/limits.conf 文件,添加以下內容 * soft nofile 65535 * hard nofile 65535# 編輯 /etc/sysctl.conf 文件,添加以下內容 fs.file-max 655352.調…