手寫promise(3)-- 實例方法 靜態方法

目錄

實例方法

catch

finally

靜態方法

reslove

?reject

race?

all?

allSettled

any


實例方法

提供給promise實例的方法 包括catch 與finally

catch

Promise 實例的 catch() 方法用于注冊一個在 promise 被拒絕時調用的函數。它會立即返回一個等效的 Promise 對象,這可以允許你鏈式調用其他 promise 的方法。此方法是 Promise.prototype.then(undefined, onRejected) 的一種簡寫形式。

1 內部調用then方法(此方法是 Promise.prototype.then(undefined, onRejected) 的一種簡寫形式。

2.處理異常 因為是實例化生成前拋出的異常 要 catch 捕獲實例化生成函數執行前

   constructor(func) {const resolve = (result) => {if (this.state == PENDING) {this.state = FULFILLED;this.result = result;this.#handlers.forEach(({ onFulfilled }) => {onFulfilled(this.result);});}};const reject = (result) => {if (this.state == PENDING) {this.state = REJECTED;this.result = result;this.#handlers.forEach(({ onRejected }) => {onRejected(this.result);});}};try {func(resolve, reject);} catch (error) {reject(error);}}catch(onRejected) {return this.then(undefined, onRejected);}
// 測試代碼const p = new MyPromise((resolve, reject) => {reject("error");// throw "error";// return p2;// return 2;// return new MyPromise((resolve, reject) => {//   resolve("OK");//   // reject("ERROR");// });
});
p.then((res) => {console.log("res:", res);
}).catch((error) => {console.log("err:", err);
});

finally

Promise 實例的 finally() 方法用于注冊一個在 promise 敲定(兌現或拒絕)時調用的函數。它會立即返回一個等效的 Promise 對象,這可以允許你鏈式調用其他 promise 方法。

finally()?方法類似于調用?then(onFinally, onFinally)

這可以讓你避免在 promise 的 then() 和 catch() 處理器中重復編寫代碼。

  • onFinally?回調函數不接收任何參數。這種情況恰好適用于你不關心拒絕原因或兌現值的情況,因此無需提供它。
  • 如果你想在 promise 敲定時進行一些處理或者清理,無論其結果如何,那么?finally()?方法會很有用。
  finally(onFinally) {return this.then(onFinally, onFinally);}
const p = new MyPromise((resolve, reject) => {reject("error");// throw "error";
});
p.then((res) => {console.log("res:", res);
}).catch((error) => {console.log("err:", error);}).finally(() => {console.log("一定執行");});

靜態方法

提供給promise靜態的方法 包括以下6個

  • reslove
  • reject
  • race
  • all
  • allsettled
  • any

reslove

Promise.resolve() 靜態方法將給定的值轉換為一個 Promise。如果該值本身就是一個 Promise,那么該 Promise 將被返回;如果該值是一個 thenable 對象,Promise.resolve() 將調用其 then() 方法及其兩個回調函數;否則,返回的 Promise 將會以該值兌現

  • 判斷傳入值
  • promise直接返回
  • 轉為promise并返回 ?fulfilled狀態

thenable對象指的是具有then方法的對象。Promise.resolve方法會將這個對象轉為Promise對象,然后立即執行thenable對象的then方法

 /*** 靜態方法 resolve*  判斷傳入值*    promise直接返回*    轉為promise并返回  fulfilled狀態*/static resolve(value) {if (value instanceof MyPromise) {return value;}return new MyPromise((resolve, reject) => {resolve(value);});}// 測試代碼// const p = MyPromise.resolve(
//   new MyPromise((resolve, reject) => {
//     resolve("ok");
//     // reject("error");
//     // throw "error";
//   })
// );
const p = MyPromise.resolve("賈公子");
p.then((res) => {console.log("res:", res);},(error) => {console.log("err:", error);}
);

?reject

Promise.reject()?靜態方法返回一個已拒絕(rejected)的?Promise?對象,拒絕原因為給定的參數。?

 static reject(value) {return new MyPromise((resolve, reject) => {reject(value);});}
// 測試代碼
const p = MyPromise.reject("賈公子");
p.then((res) => {console.log("res:", res);},(error) => {console.log("err:", error);}
);

race?

Promise.race()?靜態方法接受一個 promise 可迭代對象作為輸入,并返回一個?promise 這個返回的 promise 會隨著第一個 promise 的敲定而敲定。

接收一個promise數組 返回的結果以第一個和promise返回的結果為準

* 返回promise

* 判斷是否為數組(Array.isArray) 錯誤信息 ?Argument is not iterable

?* 等待第一個敲定 (forEach取出每一個promise執行 一旦執行就改變狀態resolve包裝一層 因為有可能傳遞的不是promise)

  /*** 靜態方法 race* 返回promise* 判斷是否為數組 錯誤信息  Argument is not iterable* 等待第一個敲定*/static race(promises) {// 1.返回promisereturn new Promise((resolve, reject) => {// 2.判斷是否為數組 錯誤信息  Argument is not iterableif (!Array.isArray(promises)) {return reject(new TypeError("Argument is not iterable"));}// 3.等待第一個敲定promises.forEach((p) => {MyPromise.resolve(p).then((res) => resolve(res),(err) => reject(err));});});}
}// 測試代碼const p1 = new MyPromise((resolve, reject) => {setTimeout(() => {resolve("ok");}, 2000);
});
const p2 = new MyPromise((resolve, reject) => {setTimeout(() => {reject("err");}, 1000);
});
const p = MyPromise.race([p1, p2]);
// const p = MyPromise.race();
p.then((res) => {console.log("res:", res);},(error) => {console.log("err:", error);}
);

all?

?Promise.all()?靜態方法接受一個 Promise 可迭代對象作為輸入,并返回一個?Promise 。當所有輸入的 Promise 都被兌現時,返回的 Promise 也將被兌現(即使傳入的是一個空的可迭代對象),并返回一個包含所有兌現值的數組。如果輸入的任何 Promise 被拒絕,則返回的 Promise 將被拒絕,并帶有第一個被拒絕的原因。

  • 1.返回promise
  • 2.判斷是否為數組 錯誤信息 ?Argument is not iterable
  • 3.空數組直接兌現
  • 4.判斷全部兌現
  • 4.1記錄結果(索引記錄保證兌現順序與傳入順序一樣)
  • 4.2判斷 全部兌現 (不能使用length 因為使用索引添加的可能導致沒有全部兌現)
  • 5.處理第一個拒絕

  static all(promises) {// 1.返回promisereturn new Promise((resolve, reject) => {// 2.判斷是否為數組 錯誤信息  Argument is not iterableif (!Array.isArray(promises)) {return reject(new TypeError("Argument is not iterable"));}// 3.空數組直接兌現promises.length === 0 && resolve(promises);// 4.判斷全部兌現const result = [];let count = 0;promises.forEach((p, index) => {MyPromise.resolve(p).then((res) => {// 4.1記錄結果(索引記錄保證兌現順序與傳入順序一樣)result[index] = res;// 4.2判斷 全部兌現 (不能使用length 因為使用索引添加的可能導致沒有全部兌現)count++;count === promises.length && resolve(result);},(err) => {// 5.處理第一個拒絕reject(err);});});});}// 測試代碼
const p1 = MyPromise.resolve(1);
const p2 = new MyPromise((resolve, reject) => {setTimeout(() => {// resolve("ok");reject("err");}, 1000);
});
const p3 = "賈公子";
const p = MyPromise.all([p1, p2, p3]);
// const p = MyPromise.all();、
// const p = MyPromise.all([]);p.then((res) => {console.log("res:", res);},(error) => {console.log("err:", error);}
);

allSettled

Promise.allSettled()?靜態方法將一個 Promise 可迭代對象作為輸入,并返回一個單獨的?promise。當所有輸入的 Promise 都已敲定時(包括傳入空的可迭代對象時),返回的 Promise 將被兌現,并帶有描述每個 Promise 結果的對象數組。

??* 1.傳入的promise都已敲定,即可獲取兌現結果

?* ?2.結果數組: [{status: 'fulfilled', value: 1},{status: 'rejected', reason: 'err'}]

?* ?3.結果數組的順序,和傳入的promise數組的順序是一樣的

?* ?4.空數組直接兌現

?* ?5.不為數組 錯誤信息 ?Argument is not iterable

  • 1.返回promise? 可以讓結果繼續.then
  • ?2.數組判斷 不為數組直接拋出異常
  • 3.為空直接敲定? 判斷length
  • 4.等待全部敲定 使用forech 循環處理 利用resolve包裝一下
  • 4.1記錄結果(result) 記錄敲定的次數(count) 不使用push 會導致沒有全部兌現
  • 4.2 處理兌現{ status: FULFILLED, value: res }
  • 4.3處理拒絕{ status: REJECTED, reason: err })
  • 成功或者失敗都是resolve
  static allSettled(promises) {// 1.返回promisereturn new Promise((resolve, reject) => {// 2.數組判斷if (!Array.isArray(promises)) {return reject(new TypeError("Argument is not iterable"));}// 3.為空直接敲定promises.length === 0 && resolve(promises);// 4.等待全部敲定const result = [];let count = 0;promises.forEach((p, index) => {MyPromise.resolve(p).then((res) => {// 4.1記錄結果result[index] = { status: FULFILLED, value: res }; // 4.2 處理兌現{ status: FULFILLED, value: res }// 記錄敲定的次數count++;// 不論成功失敗都是resolvecount === promises.length && resolve(result);},(err) => {// 4.1記錄結果result[index] = { status: REJECTED, reason: err }; // 4.3處理拒絕{ status: REJECTED, reason: err }// 記錄敲定的次數count++;// 不論成功失敗都是resolvecount === promises.length && resolve(result);});});});}
// 測試代碼
const p1 = MyPromise.resolve(1);
const p2 = new MyPromise((resolve, reject) => {setTimeout(() => {// resolve("ok");reject("err");}, 1000);
});
const p3 = "賈公子";
const p = MyPromise.allSettled([p1, p2, p3]);
// const p = MyPromise.allSettled();
// const p = MyPromise.allSettled([]);p.then((res) => {console.log("res:", res);},(error) => {console.log("err:", error);}
);

any

Promise.any()?靜態方法將一個 Promise 可迭代對象作為輸入,并返回一個?promise 當輸入的任何一個 Promise 兌現時,這個返回的 Promise 將會兌現,并返回第一個兌現的值。當所有輸入 Promise 都被拒絕(包括傳遞了空的可迭代對象)時,它會以一個包含拒絕原因數組的?AggregateErrorAggregateErrorAggregateError?拒絕。

AggregateError?對象代表了包裝了多個錯誤對象的單個錯誤對象。當一個操作需要報告多個錯誤時,例如?promise.any,當傳遞給它的所有承諾都被拒絕時,就會拋出該錯誤。

?* 參數:promise數組

?* 結果

?* ? ?獲取到第一個成功的結果

?* ? ?獲取到所有拒絕失敗的原因 AggregateError: All promises were rejected[拒絕原因1,拒絕原因n]

?* ? ?傳入空數組,直接拒絕 AggregateError: All promises were rejected[]

?* ? ?不傳入數組直接報錯

?

  • 1.返回promise?
  • 2.數組判斷 錯誤信息 Argument is not iterable
  • 3.空數組直接拒絕 AggregateError([錯誤原因],All promises were rejected[)
  • 4.等待結果
  • 4.1第一個兌現
  • 4.2全部拒絕?
  static any(promises) {// 1.返回promisereturn new Promise((resolve, reject) => {// 2.數組判斷 錯誤信息 Argument is not iterableif (!Array.isArray(promises)) {return reject(new TypeError("Argument is not iterable"));}// 3.空數組直接拒絕 AggregateError([錯誤原因],All promises were rejected[)promises.length === 0 &&reject(new AggregateError(promises, "All promises were rejected"));const errors = [];let count = 0;// 4.等待結果promises.forEach((p, index) => {MyPromise.resolve(p).then((res) => {// 4.1第一個兌現resolve(res);},(err) => {// 4.2全部拒絕errors[index] = err;count++;count === promises.length &&reject(new AggregateError(errors, "All promises were rejected"));});});});}
// 測試代碼
const p1 = new MyPromise((resolve, reject) => {setTimeout(() => {// resolve("ok");reject("err1");}, 1000);
});
const p2 = new MyPromise((resolve, reject) => {setTimeout(() => {// resolve("ok");reject("err2");}, 2000);
});
// const p3 = "賈公子";
const p3 = MyPromise.reject("賈公子");const p = MyPromise.any([p1, p2, p3]);
// const p = MyPromise.any();
// const p = MyPromise.any([]);p.then((res) => {console.log("res:", res);},(error) => {// console.log("err:", error);console.dir(error);}
);

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

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

相關文章

一文詳解 requests 庫中 json 參數和 data 參數的用法

在requests庫當中,requests請求方法,當發送post/put/delete等帶有請求體的請求時,有json和data2個參數可選。 眾所周知,http請求的請求體格式主要有以下4種: application/json applicaiton/x-www-from-urlencoded …

java堆文件排查

技術主題 在之前的開發的一個項目中,因為程序的一個bug,導致一些引用的對象一直沒有回收,從而導致堆內存一直在增大,老年代一直在增大,老年代進行堆積,后來的排查思路是通過dump堆的文件,然后對…

Dockerfile-CentOS7.9+Python3.11.2

本文為CentOS7.9下安裝Python3.11.2環境的Dockerfile # CentOS with Python3.11.2 # Author xxmail.com# build a new image with basic centos FROM centos:centos7.9.2009 # who is the author MAINTAINER xxmail.comRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/…

vue的生命周期及不同階段狀態可以進行的行為

什么是vue的生命周期? Vue 的實例從創建到銷毀的過程 ,就是生命周期 ,也就是從開始創建 ,初始化數據 ,編譯模板 ,掛載Dom到渲染DOM ,更新數據再到渲染 ,卸載等一系列的過程 &#x…

OpenAI研發神秘“Q*”模型:科學家認輸,AI贏了人類關鍵一戰

圖片來源:視覺中國 作者丨葉蓁 編輯丨康曉 出品丨深網騰訊新聞小滿工作室 在山姆奧特曼(Sam Altman)被OpenAI前董事會突然罷免之前,數位研究人員向董事會發送了一封信,警告稱他們發現了一種能夠威脅到人類的強大人工…

IIS 基線安全加固操作

目錄 賬號管理、認證授權 ELK-IIS-01-01-01 ELK-IIS-01-01-02 ELK-IIS-01-01-03 ELK-IIS-01-01-04 日志配置 ELK-IIS-02-01-01 ELK-IIS-02-01-02 ??????? ELK-IIS-02-01-03 通信協議 ELK-IIS-03-01-01 設備其他安全要求 ELK-IIS-04-01-01 ??????? ELK-I…

【DDS】OpenDDS配置與使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 這篇文章主要介紹OpenDDS配置與使用。 無專精則不能成,無涉獵則不能通。——梁啟超 歡迎來到我的博客,一起學習,共同進步。 喜歡的朋友可以關注一下,下次更…

華為云編譯構建CodeArts Build常見問答匯總

1.【Build】公有云編譯構建是否支持導入外部機器做執行機 答:參考鏈接:https://support.huaweicloud.com/usermanual-devcloud/devcloud_01_0017.html ? 使用代理機功能,需要配備1臺4U8G或以上規格、磁盤>80GB的主機。 ? 安裝代理的…

Ubuntu 啟用 root 用戶

在啟用 root 用戶之前,我們先來了解一下, ubuntu 命令的組成。 打開 ubuntu 的終端,現在的命令行是由 topeetubuntu:~$ 這幾個字母組成,那么這幾個字母都代表 什么意思呢? topeet …

配電室智慧運維監控系統

配電室智能運維監控系統是一個綜合性的管理系統,專門針對配電室的運維工作進行設計。依托電易云-智慧電力物聯網,它融合了先進的監測技術、自動化技術、數據分析技術等,對配電室進行全方位、實時的智能化監控和管理,以提升配電室運…

人工智能對當代生活的影響

人工智能(AI)是指通過模擬人類智能的方式,使機器能夠執行某些需要智能的任務。隨著技術的快速發展和應用的廣泛推廣,人工智能已經深入到我們的日常生活中,對我們的生活和社會產生了深遠的影響。本文將探討人工智能對當…

Django同時連接多種數據庫

我的使用場景需要同時連接達夢數據庫和MYSQL數據庫,有的功能需要查詢達夢,有的功能則需要查詢MYSQL。 第一步:在 Django 的 settings.py 文件中,配置多個數據庫連接。你可以在 DATABASES 字典中添加多個數據庫配置。每個數據庫配置…

關于 Google AMP 和 SEO

Google 于 2015 年首次推出 AMP,即加速移動頁面。借助開源 AMP 框架,網頁設計師可以制作快速加載的移動網頁。該框架的創建是為了應對使用移動設備訪問互聯網的個人數量的增加。從那時起,谷歌一直在推動使用 AMP 來增強移動設備上的 SEO 和用…

【漏洞復現】好視通視頻會議系統(fastmeeting) toDownload.do接口存在任意文件讀取漏洞 附POC

漏洞描述 “好視通”是國內云視頻會議知名品牌,擁有多項創新核心技術優勢、多方通信服務牌照及行業全面資質 [5] ,專注為政府、公檢法司、教育、集團企業等用戶提供“云+端+業務全場景”解決方案。用全國產、高清流暢、安全穩定的云視頻服務助力各行各業數字化轉型。 其視頻…

opencv-Meanshift 和 Camshift 算法

MeanShift 和 CamShift 都是用于目標跟蹤的算法,基于顏色直方圖的方法。它們主要用于在視頻序列中追蹤運動的對象。 MeanShift(均值漂移): 原理: MeanShift 算法的基本思想是通過不斷調整窗口的中心,使得窗口中的樣本點的平均值向…

介紹正則表達式及其用法

正則表達式(Regular Expression),簡稱為"正則",是一種用于描述、匹配、搜索文本的方式。正則表達式通常由符號和字符組成,可以用于匹配和搜索特定模式的文本。 以下是一些常用的正則表達式元字符及其用法&am…

多模態常見任務介紹

視覺問答(VQA, Visual Question Answer) 目標:給定一個圖片以及問題,需要理解圖片的內容并基于此用自然語言回答問題。 例如,圖像中發生什么事,人物穿的衣服是什么顏色,圖像中有多…

復亞智能交通無人機:智慧交通解決方案大公開

城市的現代化發展離不開高效的交通管理規劃。傳統的交通管理系統龐大繁瑣,交警在執行任務時存在安全隱患。在這一背景下,復亞智能交通無人機應運而生,成為智慧交通管理中的重要組成部分。交通無人機憑借其高靈活性、低成本、高安全性等特點&a…

兒童在線學習系統 寶寶云幼兒園服務微信小程序的設計與實現

綜合運用所學的程序設計基礎、數據結構、數據庫原理及應用、高級語言程序設計、面向對象程序設計、軟件需求分析與建模、軟件設計與體系結構、軟件測試等課程知識,設計開發一個較實用的應用系統。 通過該設計可以鞏固并提高軟件工程專業學生的軟件需求分析、設計、開…