Js的 Promise的 then catch 筆記240222

Js的 Promise的 then catch 筆記240222

在這里插入圖片描述

基本用法

new Promise(f=>{setTimeout(ev=>{f("一秒后輸出控制臺");},1000);
}).then(f的參數=>{console.log(f的參數);
});
// 控制臺輸出: 一秒后輸出控制臺

上面代碼中, f 的標準名叫做 resolve , 所以應該寫成

new Promise(resolve=>{setTimeout(ev=>{resolve("一秒后輸出控制臺");},1000);
}).then(傳入resolve的參數=>{console.log(傳入resolve的參數);
});
// 控制臺輸出: 一秒后輸出控制臺

實際上Promisethen都可以有兩個參數, resolvereject

new Promise((resolve,reject)=>{setTimeout(ev=>{resolve("傳入resolve的參數"); //執行了resolve就不會執行rejectreject("傳入reject的參數");   //執行了reject就不會執行resolve},1000);
}).then(傳入resolve的參數=>{console.log(傳入resolve的參數);
},      傳入reject的參數=>{console.log(傳入reject的參數);
});
// 控制臺輸出: 傳入resolve的參數

雖然Promise中的resolvereject都會執行,
then參中的resolvereject只會執行其中一個, 前面的執行了,后面就不執行了,
resolvereject調換位置測試

new Promise((resolve,reject)=>{setTimeout(ev=>{reject("傳入reject的參數");   //執行了reject就不會執行resolveresolve("傳入resolve的參數"); //執行了resolve就不會執行reject},2000);
}).then(傳入resolve的參數=>{console.log(傳入resolve的參數);
},      傳入reject的參數=>{console.log(傳入reject的參數);
});
// 控制臺輸出: 傳入reject的參數

可以將resolvereject分別寫到try{}cattch(e){}

new Promise((resolve,reject)=>{setTimeout(ev=>{try{resolve("傳入resolve的參數"); //執行了resolve就不會執行reject}catch(e){reject("傳入reject的參數");   //執行了reject就不會執行resolve}},1000);
}).then(傳入resolve的參數=>{console.log(傳入resolve的參數);
},      傳入reject的參數=>{console.log(傳入reject的參數);
});
// 控制臺輸出: 傳入resolve的參數

這樣正常執行resolve, 異常執行reject .
但如果在then塊中拋異常了怎么辦呢? 可以寫到catch函數中, 注意是catch函數,不是trycatch塊.
下面模擬then中拋異常

new Promise((resolve,reject)=>{setTimeout(ev=>{try{resolve("傳入resolve的參數"); //執行了resolve就不會執行reject}catch(e){console.log(e);reject("傳入reject的參數");   //執行了reject就不會執行resolve}},3000);
}).then(傳入resolve的參數=>{console.log(傳入resolve的參數); throw "then參1函數拋異常";
},      傳入reject的參數=>{console.log(傳入reject的參數);  throw "then參2函數拋異常";
}).catch(err=>{console.log(err);
});
// 控制臺輸出: 
傳入resolve的參數
then參1函數拋異常

catchthen兩個參數函數的異常都能捕捉,反正只會執行其中一個.

下面模擬在resolve前出現異常

new Promise((resolve,reject)=>{setTimeout(ev=>{try{throw "resolve之前出現了異常"resolve("傳入resolve的參數"); //執行了resolve就不會執行reject}catch(e){console.log(e);reject("傳入reject的參數");   //執行了reject就不會執行resolve}},4000);
}).then(傳入resolve的參數=>{console.log(傳入resolve的參數); throw "then參1函數拋異常";
},      傳入reject的參數=>{console.log(傳入reject的參數);  throw "then參2函數拋異常";
}).catch(err=>{console.log(err);
});
// 控制臺輸出: 
resolve之前出現了異常
傳入reject的參數
then參2函數拋異常

可以在thenreturn返回新的Promise, 就可以再次調用then, 稱為then的鏈式調用.

new Promise((resolve,reject)=>{setTimeout(ev=>{try{resolve("傳入resolve的參數"); //執行了resolve就不會執行reject}catch(e){console.log(e);reject("傳入reject的參數");   //執行了reject就不會執行resolve}},4500);
}).then(傳入resolve的參數=>{console.log(傳入resolve的參數); return new Promise(resolve2=>resolve2("傳入resolve2的參數"))
},      傳入reject的參數=>{console.log(傳入reject的參數);  throw "then參2函數拋異常";
}).catch(err=>{console.log(err);
}).then(傳入resolve2的參數=>{console.log(傳入resolve2的參數);  throw "第二個then參1函數拋異常";
}).catch(err=>{console.log(err);
});
// 控制臺輸出: 
傳入resolve的參數
傳入resolve2的參數
第二個then參1函數拋異常
  • 可以 then().then().then()...
  • 也可以then().catch().then().catch().then().catch()...
then中 簡寫 new Promise

上面的 return new Promise(resolve2=>resolve2("傳入resolve2的參數"))
可簡寫為 return Promise.resolve("傳入resolve2的參數");
甚至可簡寫為 return "傳入resolve2的參數";

then中的
return new Promise(resolve2=>resolve2("傳入resolve2的參數"))
可簡寫為 
return Promise.resolve("傳入resolve2的參數");
甚至可簡寫為 
return "傳入resolve2的參數";
new Promise((resolve,reject)=>{setTimeout(ev=>{try{resolve("傳入resolve的參數"); //執行了resolve就不會執行reject}catch(e){console.log(e);reject("傳入reject的參數");   //執行了reject就不會執行resolve}},4500);
}).then(傳入resolve的參數=>{console.log(傳入resolve的參數); return new Promise(resolve2=>resolve2("傳入resolve2的參數"))
},      傳入reject的參數=>{console.log(傳入reject的參數);  throw "then參2函數拋異常";
}).catch(err=>{console.log(err);
}).then(傳入resolve2的參數=>{console.log(傳入resolve2的參數);  throw "第二個then參1函數拋異常";
}).catch(err=>{console.log(err);
});// then鏈式調用簡寫, then中的 new Promise 簡寫new Promise((resolve,reject)=>{setTimeout(ev=>{try{resolve("傳入resolve的參數"); //執行了resolve就不會執行reject}catch(e){console.log(e);reject("傳入reject的參數");   //執行了reject就不會執行resolve}},4600);
}).then(傳入resolve的參數=>{console.log(傳入resolve的參數); return Promise.resolve("傳入resolve2的參數");
},      傳入reject的參數=>{console.log(傳入reject的參數);  throw "then參2函數拋異常";
}).catch(err=>{console.log(err);
}).then(傳入resolve2的參數=>{console.log(傳入resolve2的參數);  throw "第二個then參1函數拋異常";
}).catch(err=>{console.log(err);
});new Promise((resolve,reject)=>{setTimeout(ev=>{try{resolve("傳入resolve的參數"); //執行了resolve就不會執行reject}catch(e){console.log(e);reject("傳入reject的參數");   //執行了reject就不會執行resolve}},4700);
}).then(傳入resolve的參數=>{console.log(傳入resolve的參數); return "傳入resolve2的參數";
},      傳入reject的參數=>{console.log(傳入reject的參數);  throw "then參2函數拋異常";
}).catch(err=>{console.log(err);
}).then(傳入resolve2的參數=>{console.log(傳入resolve2的參數);  throw "第二個then參1函數拋異常";
}).catch(err=>{console.log(err);
});




其它參考

Promise - JavaScript | MDN

Promise() 構造函數- JavaScript | MDN

使用Promise - JavaScript | MDN



Promise 是 JavaScript 中用于處理異步操作的對象,它代表了某個最終可能完成或失敗的操作及其結果值的狀態。Promise 可以幫助你組織和處理異步代碼,使得它更加容易理解和維護。

Promise 有三種狀態:

  1. Pending(等待中):初始狀態,既不是成功,也不是失敗。
  2. Fulfilled(已實現):意味著操作成功完成。
  3. Rejected(已拒絕):意味著操作失敗。

Promise 的基本用法如下:

  1. 創建一個新的 Promise 對象:
const promise = new Promise((resolve, reject) => {// 異步操作// 如果成功,調用 resolve() 并傳入結果值// 如果失敗,調用 reject() 并傳入錯誤原因或 Error 對象
});

在上面的代碼中,我們傳遞了一個函數給 Promise 構造函數,這個函數接收兩個參數:resolvereject,它們是兩個函數,由 JavaScript 引擎提供,不需要自己部署。

  1. 使用 .then() 方法處理 Promise:

當 Promise 的狀態變為 Fulfilled 時,會調用 .then() 方法中指定的回調函數,并傳入 Promise 的結果值。你可以在這個回調函數中處理 Promise 成功完成后的邏輯。

promise.then(result => {console.log(result); // 處理 Promise 成功后的結果
});
  1. 使用 .catch() 方法處理 Promise:

當 Promise 的狀態變為 Rejected 時,會調用 .catch() 方法中指定的回調函數,并傳入 Promise 的錯誤原因。你可以在這個回調函數中處理 Promise 失敗后的邏輯。

promise.catch(error => {console.error(error); // 處理 Promise 失敗后的錯誤
});

另外,你還可以使用 .finally() 方法來處理無論 Promise 成功還是失敗都需要執行的邏輯。這個方法在 Promise 狀態改變后會被調用,無論狀態是 Fulfilled 還是 Rejected。

下面是一個完整的 Promise 示例:

const promise = new Promise((resolve, reject) => {setTimeout(() => {const success = true; // 假設這是一個異步操作的結果if (success) {resolve('操作成功!'); // 當操作成功時,調用 resolve() 并傳入結果值} else {reject('操作失敗!'); // 當操作失敗時,調用 reject() 并傳入錯誤原因}}, 1000); // 模擬異步操作,延遲 1 秒后執行
});promise.then(result => {console.log(result); // 輸出:操作成功!}).catch(error => {console.error(error); // 如果操作失敗,會輸出:操作失敗!}).finally(() => {console.log('Promise 已處理完畢。'); // 無論成功還是失敗,都會輸出這句話。});



JavaScript的Promise是一種用于處理異步操作的對象。它將異步操作的結果以同步的方式進行處理,使得代碼更加清晰和易于維護。

  1. Promise的基本概念:

    • Promise是一個對象,它代表了一個異步操作的最終完成或失敗的結果。
    • Promise有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。
    • Promise的狀態一旦改變,就不會再變。
  2. Promise的基本用法:

    • 創建Promise對象:使用Promise構造函數來創建一個Promise對象,構造函數接受一個執行器函數作為參數。
    • 執行器函數:執行器函數接受兩個參數,分別是resolve和reject。在異步操作完成時,調用resolve函數將Promise的狀態改為fulfilled;在異步操作失敗時,調用reject函數將Promise的狀態改為rejected。
    • 處理Promise的結果:可以使用then方法來處理Promise的結果,then方法接受兩個回調函數作為參數,分別是在Promise狀態變為fulfilled時調用的回調函數和在Promise狀態變為rejected時調用的回調函數。
  3. Promise的鏈式調用:

    • then方法可以返回一個新的Promise對象,使得多個異步操作可以按照順序執行。
    • 可以通過在then方法中返回一個新的Promise對象來實現鏈式調用。
    • 可以使用catch方法來捕獲Promise鏈中的錯誤。

下面是一個使用Promise的示例代碼:

function getData() {return new Promise((resolve, reject) => {// 異步操作,例如發送Ajax請求setTimeout(() => {const data = '這是從服務器獲取的數據';resolve(data);}, 2000);});
}getData().then((data) => {console.log('成功獲取數據:', data);return data.toUpperCase();}).then((upperCaseData) => {console.log('轉換為大寫:', upperCaseData);}).catch((error) => {console.error('獲取數據失敗:', error);});

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

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

相關文章

知識圖譜數據處理流程是什么

在當今信息時代,數據已經成為企業決策和業務發展的重要驅動力。然而,隨著數據量的不斷增加,傳統的數據處理方法已經難以滿足需求。知識圖譜作為一種新興的技術,正逐漸成為處理大規模數據的關鍵工具。本文將深入探討知識圖譜的數據…

寫代碼中的一些“小技巧”

目錄 前言 1.不注重代碼格式 1.1 空格 1.2 換行 2.隨意的命名 2.1 有意義的參數名 2.2 見名知意 2.3 參數名風格一致 3.出現大量重復代碼 4.從不寫注釋 5.方法過長 6.參數過多 7.代碼層級太深 8.判斷條件太多 9.硬編碼 10.事務過大 11.在循環中遠程調用 11.1 …

CSS 面試題匯總

CSS 面試題匯總 1. 介紹下 BFC 及其應 參考答案: 參考答案: 所謂 BFC,指的是一個獨立的布局環境,BFC 內部的元素布局與外部互不影響。 觸發 BFC 的方式有很多,常見的有: 設置浮動overflow 設置為 auto、scr…

Swift基礎知識:20.Swift方法

在 Swift 中,方法是與特定類型相關聯的函數。方法可以用于實例類型(實例方法)或類型本身(類型方法)。方法允許類型的實例執行特定的任務,也可以修改實例本身或實例的屬性。 實例方法(Instance …

【力扣hot100】刷題筆記Day10

前言 一鼓作氣把鏈表給刷完!!中等題困難題沖沖沖啊啊啊! 25. K 個一組翻轉鏈表 - 力扣(LeetCode) 模擬 class Solution:def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:# 翻轉…

題記(46)--兩個多項式的和

目錄 一、題目內容 二、輸入描述 三、輸出描述 四、輸入輸出示例 五、完整C語言代碼 一、題目內容 輸入兩個多項式,計算它們的和。 每個多項式有若干對整數表示,每組整數中,第一個整數表示系數(非0),第…

#LLM入門|Prompt#1.7_文本拓展_Expanding

輸入簡短文本,生成更加豐富的長文。 “溫度”(temperature):控制文本生成的多樣性。 一、定制客戶郵件 根據客戶的評價和其中的情感傾向,使用大語言模型針對性地生成回復郵件。將大大提升客戶滿意度。 # 我們可以在…

云原生 - K8s命令合集

我是南城余!阿里云開發者平臺專家博士證書獲得者! 歡迎關注我的博客!一同成長! 一名從事運維開發的worker,記錄分享學習。 專注于AI,運維開發,windows Linux 系統領域的分享! 知…

兩種動態代理(可以看到代理類的樣子,方便理解)

這里寫目錄標題 jdk動態代理例子CGlib動態代理例子手寫spring中的事務部分自定義注解版aop實現方式 Spring的兩大重點,IOC和AOP,今天我們就來學AOP,眾所周知AOP的底層是動態代理,讓我們看一下這兩種動態代理的區別。 例子&#x…

tvm交叉編譯android可執行參考資料整理

主要參考這個: TVM部署神經網絡模型到android端_tvm android-CSDN博客 其他相關鏈接: TVM部署神經網絡模型到android端 - 代碼先鋒網 Ubuntu交叉編譯 arm板子上的TVM_tvm arm-CSDN博客 TVM部署神經網絡模型到android端 - 代碼先鋒網 tvm部署c神經網…

【Spring連載】使用Spring Data訪問 MongoDB(五)----生命周期事件

【Spring連載】使用Spring Data訪問 MongoDB(五)----生命周期事件Lifecycle Events 一、實體回調Entity Callbacks1.1 實現實體回調1.2 注冊實體回調 二、特定存儲的實體回調 一、實體回調Entity Callbacks 1.1 實現實體回調 1.2 注冊實體回調 二、特…

【結合OpenAI官方文檔】解決Chatgpt的API接口請求速率限制

OpenAI API接口請求速率限制 速率限制以五種方式衡量:RPM(每分鐘請求數)、RPD(每天請求數)、TPM(每分鐘令牌數)、TPD(每天令牌數)和IPM(每分鐘圖像數&#x…

BUUCTF第二十四、二十五題解題思路

目錄 第二十四題CrackRTF 第二十五題[2019紅帽杯]easyRE1 第二十四題CrackRTF 查殼 無殼,32位,用32位IDA打開,打開后的main函數很短,可以找到一句“jmz _main_0”——跳轉到 _main_0,說明真正的主函數是_main_0&am…

React 模態框的設計(二)

自定義組件是每個前端開發者必備的技能。我們在使用現有框架時難免有一些超乎框架以處的特別的需求,比如關于彈窗,每個應用都會用到,但是有時我們使用的框架中提供的彈窗功能也是功能有限,無法滿足我們的應用需求,今天…

【linux】使用 acme.sh 實現了 acme 協議生成免費的SSL 證書

acme.sh 實現了 acme 協議, 可以從 letsencrypt 生成免費的證書. 主要步驟: 安裝 acme.sh生成證書copy 證書到 nginx/apache 或者其他服務更新證書更新 acme.sh出錯怎么辦, 如何調試 下面詳細介紹. 1. 安裝 acme.sh 安裝很簡單, 一個命令: curl https://get.acme.sh | sh…

隱藏餓了么el-select組件的el-select-dropdown部分,只使用el-select的顯示框

隱藏餓了么el-select組件的el-select-dropdown部分,只使用el-select的顯示框 問題: 由于el-select組件的el-select-dropdown部分是自動插入在最外層Body上的,所以在當前組件的scoped中讓el-select-dropdown組件display:none不會生效所以需要: :popper-…

Java架構師之路六、高并發與性能優化:高并發編程、性能調優、線程池、NIO、Netty、高性能數據庫等。

目錄 高并發編程: 性能調優: 線程池: NIO: Netty: 高性能數據庫: 上篇:Java架構師之路五、微服務:微服務架構、服務注冊與發現、服務治理、服務監控、容器化等。-CSDN博客 下篇…

TiDB 7.5.0 LTS 高性能數據批處理方案

過去,TiDB 由于不支持存儲過程、大事務的使用也存在一些限制,使得在 TiDB 上進行一些復雜的數據批量處理變得比較復雜。 TiDB 在面向這種超大規模數據的批處理場景,其能力也一直在演進,其復雜度也變得越來越低: ○ 從…

11.CSS3的媒介(media)查詢

CSS3 的媒介(media)查詢 經典真題 如何使用媒體查詢實現視口寬度大于 320px 小于 640px 時 div 元素寬度變成 30% 媒體查詢 媒體查詢英文全稱 Media Query,顧名思義就是會查詢用戶所使用的媒體或者媒介。 在現在,網頁的瀏覽終端是越來越多了。用戶可…

C++:string類

標準庫中的string類 string類 1. 字符串是表示字符序列的類 2. 標準的字符串類提供了對此類對象的支持,其接口類似于標準字符容器的接口,但添加了專門用于操作單字節字符字符串的設計特性。 3. string類是使用char(即作為它的字符類型,使用…