Promise怎么使用,以及它解決了什么問題?

?什么是 Promise?

`Promise` 是一種用于處理異步操作的 JavaScript 對象,它代表了一個可能還未完成但將來會完成的操作的結果。`Promise` 的目的是解決回調函數(callback)帶來的問題,比如回調地獄(callback hell)和異步操作的鏈式調用等。

?Promise 的基本用法

一個 `Promise` 是一個包含以下幾種狀態的對象:
1. Pending(等待中):初始狀態,表示異步操作尚未完成。
2. Fulfilled(已完成):異步操作成功完成。
3. Rejected(已拒絕):異步操作失敗。

`Promise` 提供了 `.then()` 和 `.catch()` 方法來處理異步操作成功或失敗的情況。

?1. 創建 Promise

創建一個 `Promise` 對象時,需要傳入一個 executor(執行器)函數,該函數接受兩個參數:`resolve` 和 `reject`,分別用于表示操作成功和失敗。

javascript
const promise = new Promise((resolve, reject) => {// 模擬異步操作const success = true;if (success) {resolve('操作成功');} else {reject('操作失敗');}
});

?2. 使用 `.then()` 處理成功結果

`.then()` 方法用于指定操作成功時的回調函數,返回一個新的 `Promise` 對象。

javascript
promise.then(result => {console.log(result); ?// '操作成功'}).catch(error => {console.log(error); ?// 處理失敗});

?3. 使用 `.catch()` 處理錯誤

`.catch()` 用于指定操作失敗時的回調函數,類似于 `.then()` 的第二個參數,但 `.catch()` 更加簡潔明了,專門用于處理錯誤。

javascript
promise.then(result => {console.log(result);}).catch(error => {console.error(error); ?// 如果操作失敗,會觸發});

?4. 鏈式調用

由于 `.then()` 和 `.catch()` 都返回一個新的 `Promise`,可以進行鏈式調用。

javascript
promise.then(result => {console.log(result);return '繼續鏈式操作'; ?// 返回的結果會傳遞給下一個 then}).then(nextResult => {console.log(nextResult); ?// '繼續鏈式操作'}).catch(error => {console.log(error);});


?

?Promise 解決了什么問題?

1. 回調地獄(Callback Hell)問題:
? ?在沒有 `Promise` 之前,異步操作通常依賴回調函數(如:`setTimeout`、`XMLHttpRequest`、`fs.readFile` 等)。多個異步操作嵌套時,回調函數會導致代碼嵌套過深,難以閱讀和維護(即“回調地獄”)。

? ?回調地獄示例:javascriptasyncOperation1(function(result1) {asyncOperation2(function(result2) {asyncOperation3(function(result3) {console.log(result3);});});});


?

? ?使用 `Promise` 后,異步操作的結果可以鏈式傳遞,避免了過深的嵌套。

?

 ?Promise 解決回調地獄:javascriptasyncOperation1().then(result1 => {return asyncOperation2();}).then(result2 => {return asyncOperation3();}).then(result3 => {console.log(result3);}).catch(error => {console.error(error);});

2. 錯誤處理更直觀:
? ?傳統的回調函數無法很好地處理錯誤,通常需要通過傳遞一個錯誤回調來進行處理。但在多層嵌套的回調中,錯誤處理變得復雜。`Promise` 使用 `.catch()` 來集中處理錯誤,代碼更加簡潔易懂。

?javascriptpromise.then(result => {console.log(result);}).catch(error => {console.log(error); ?// 只需寫一次 catch 來捕獲整個鏈中的錯誤});

3. 異步操作的順序控制:
? ?使用 `Promise`,你可以清晰地控制多個異步操作的順序執行和返回結果,而不像回調函數那樣讓流程變得混亂。

? ?多個異步操作按順序執行:javascriptpromise1().then(result1 => {return promise2(result1); ?// 通過返回 Promise 鏈式調用}).then(result2 => {return promise3(result2);}).then(result3 => {console.log(result3);}).catch(error => {console.log(error);});

4. 并行異步操作:
? ?`Promise` 還提供了 `Promise.all()` 和 `Promise.race()` 等方法,允許你并行執行多個異步操作,并在它們都完成后進行處理。

? ?使用 `Promise.all()`:
?

 ?javascriptPromise.all([promise1(), promise2(), promise3()]).then(results => {console.log(results); ?// 所有 Promise 都完成后才會執行}).catch(error => {console.error(error); ?// 如果有任何一個 Promise 失敗,整個操作會被拒絕});


? ?

? ?使用 `Promise.race()`:

? ?javascriptPromise.race([promise1(), promise2(), promise3()]).then(result => {console.log(result); ?// 第一個完成的 Promise 會返回結果}).catch(error => {console.error(error);});


?

總結

- Promise?使得異步操作更加直觀、易讀,解決了回調地獄和錯誤處理混亂的問題。
- 鏈式調用:多個異步操作可以通過 `.then()` 方法鏈式處理。
- 集中處理錯誤:使用 `.catch()` 可以統一捕獲鏈式調用中的任何錯誤。
- 并行執行:`Promise.all()` 和 `Promise.race()` 讓多個異步操作的并行處理變得簡單。

`Promise` 是現代 JavaScript 中處理異步操作的重要工具,并且是 `async/await` 的基礎。

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

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

相關文章

光譜范圍與顏色感知的關系

光譜范圍與顏色感知是光學、生理學及技術應用交叉的核心課題,兩者通過波長分布、人眼響應及技術處理共同決定人類對色彩的認知。以下是其關系的系統解析: ?1.基礎原理:光譜范圍與可見光? ?光譜范圍定義?: 電磁波譜中能被特定…

如何讓DeepSeek-R1在內網穩定運行并實現隨時隨地遠程在線調用

前言:最近,國產AI圈里的新星——Deepseek,簡直是火到不行。但是,你是不是已經對那些千篇一律的手機APP和網頁版體驗感到膩味了?別急,今天就帶你解鎖一個超炫的操作:在你的Windows電腦上本地部署…

leetcode33.搜索旋轉排序數組

思路源于 【小白都能聽懂的算法課】【力扣】【Leetcode33】搜索旋轉排序數組 | 二分查找 | 數組 主要是數組旋轉后分為左右兩個升序區間 ,如果mid落在左區間并且目標大小也在left-mid中,那么right右縮 class Solution {public int search(int[] nums, i…

《TypeScript 7天速成系列》第6天:TypeScript裝飾器+混入:高級編程模式揭秘

裝飾器是TypeScript中一項強大的元編程特性,被Angular和Vue3等主流框架廣泛使用。今天我們將深入探討這一高級特性。 裝飾器基礎 裝飾器是一種特殊類型的聲明,可以附加到類聲明、方法、訪問器、屬性或參數上。裝飾器使用expression形式,其中…

YOLO歷代發展 圖像增強方式 架構

YOLO1 YOLOV5 數據增強 mosaic 仿射變換(Affine)、透視變換(Perspective) 網絡搭建

NX二次開發刻字功能——布爾運算

刻字功能在經歷、創建文本、拉伸功能以后就剩下布爾運算了。布爾運算的目的就是實現文本時凸還是凹。這部分內容很簡單。 1、首先識別布爾運算的類型,我這里用到一個枚舉類型的選項,凸就是布爾求和,凹就是布爾求差。 2、其放置位置為創建拉伸…

【MySQL基礎】數據庫及表基本操作

作為運維工程師,掌握MySQL的基礎操作是日常工作的重要技能之一。本文將介紹MySQL中數據庫和表的基本操作,幫助您快速上手或復習這些核心概念。 1 數據庫基本操作 1.1 創建數據庫 create database db_name; -- 指定字符集和排序規則 create database d…

Python貝葉斯分層模型專題|對環境健康、醫學心梗患者、體育賽事數據空間異質性實證分析合集|附數據代碼

全文鏈接:https://tecdat.cn/?p41267 在大數據時代,多水平數據結構廣泛存在于環境健康、醫學研究和體育賽事等領域。本專題合集聚焦貝葉斯分層模型(Hierarchical Bayesian Model)的創新應用,通過氡氣污染數據與 季后…

基于 Qt / HTTP/JSON 的智能天氣預報系統測試報告

目錄 一、項目概述 1.1項目背景 1.2項目目標 二、功能需求 2.1 用戶界面功能 2.2 后臺功能 三、技術選擇 3.1 開發框架與工具 3.2 第三方 API 四、UI設計 4.1界面展示 4.2stylesheet樣式 五、代碼實現 1.構造函數 2.網絡請求響應處理函數 3.處理json數據 4.更新…

GitLab 中文版17.10正式發布,27項重點功能解讀【三】

GitLab 是一個全球知名的一體化 DevOps 平臺,很多人都通過私有化部署 GitLab 來進行源代碼托管。極狐GitLab 是 GitLab 在中國的發行版,專門為中國程序員服務。可以一鍵式部署極狐GitLab。 學習極狐GitLab 的相關資料: 極狐GitLab 官網極狐…

DPO介紹+公式推理

1. 什么是DPO? DPO(Direct Preference Optimization)是一種用于對齊大語言模型(LLMs)的新型方法,旨在高效地將人類偏好融入模型訓練中。它提供了一種替代強化學習(如 RLHF, Reinforcement Learn…

C語言基礎—構造類型

數據類型 1.基本類型/基礎類型 整型 短整型:short[int] --2字節 基本整型:int --4字節 長整型:long[int] --32位4字節/64位8字節 長長整型:long long [int] (C99) 注意:以上類型又都分為sig…

2025年高壓電工考試真題分享

以下是一些高壓電工考試題: 單選題 1、高壓架空線路的檔距一般為( )。 A. 20 - 30m B. 30 - 50m C. 50 - 80m D. 80 - 100m 答案:B。解析:高壓架空線路檔距一般在 30 - 50m,這樣的檔距能較好地保證線…

什么是SQL作業

SQL作業是在數據庫服務器上按特定時間或間隔自動執行的計劃任務或流程,這些作業由Microsoft SQL Server中的SQL Server代理管理,對于自動執行日常任務(如數據庫系統中的備份、數據導入和報告生成)以及確保及時準確地處理和更新數據…

【數據分享】基于聯合國城市化程度框架的全球城市邊界數據集(免費獲取/Shp格式)

在全球城市化進程不斷加快的今天,如何精準定義和測量“城市”成為關鍵問題。不同國家和機構采用不同的標準,導致全球城市化水平的統計結果存在較大差異。同時,由于數據來源分散、標準不統一,獲取一套完整、可比的全球城市邊界數據…

劉火良FreeRTOS內核實現與應用學習之6——多優先級

在FreeRTOS中,數字優先級越小,邏輯優先級也越小;在任務創建時,會根據任務的優先級將任務插入就緒列表不同的位置。 List_t pxReadyTasksLists[ configMAX_PRIORITIES ] 就緒列表是一個數組,數組中存儲的是就緒任務TCB(…

生成信息提取的大型語言模型綜述

摘要 信息提取(IE)旨在從簡單的自然語言文本中提取結構知識。最近,生成型大型語言模型(LLMs)在文本理解和生成方面表現出了顯著的能力。因此,已經提出了許多基于生成范式將LLM集成到IE任務中的工作。為了對…

簡單談談很火的MCP( Model Context Protocol,模型上下文協議)

MCP( Model Context Protocol,模型上下文協議)是由Anthropic推出的開放協議,并非獨立的大模型,而是連接大模型與外部工具/數據源的標準化接口?,旨在解決AI工具開發中接口不統一、跨模型共享困難等問題。? 一、工作原理 MCP 協…

解決linux centos ubuntu等無法啟動谷歌chrome瀏覽器問題

命令啟動chrome時候提示: Running as root without --no-sandbox is not supported. See https://crbug.com/638180. 解決無法啟動谷歌chrome瀏覽器: cd /usr/bin 發現目錄下有 google-chrome google-chrome-stable 執行: vim go…

深入解析緩沖區:計算機世界的“蓄水池”與“加速器”

引言 想象這樣一個場景: 你的手機正在播放4K視頻,同時下載大型文件 視頻畫面流暢無卡頓,下載速度穩定在滿帶寬 但手機的內存只有8GB,下載文件的大小卻超過20GB 這看似矛盾的現象背后,緩沖區(Buffer&am…