手寫 Promise:深入理解異步編程的基石

在這里插入圖片描述

手寫 Promise:深入理解異步編程的基石

本文將帶您逐步實現一個簡單的 Promise,以幫助您深入理解異步編程的基本概念。通過自己動手編寫 Promise 的過程,您將更好地理解 Promise 的工作原理和常見用法,并能夠應用于實際項目中。

Promise 的基本結構

Promise 是一個構造函數,它接受一個執行器函數作為參數。在執行器函數中,我們可以進行異步操作,并根據操作的結果來調用 Promise 的 resolve 和 reject 方法。

class MyPromise {constructor(executor) {this.state = 'pending';this.value = undefined;this.callbacks = [];const resolve = (value) => {if (this.state === 'pending') {this.state = 'fulfilled';this.value = value;this.callbacks.forEach(callback => this.executeCallback(callback));}};const reject = (reason) => {if (this.state === 'pending') {this.state = 'rejected';this.value = reason;this.callbacks.forEach(callback => this.executeCallback(callback));}};executor(resolve, reject);}executeCallback(callback) {const { onFulfilled, onRejected, resolve, reject } = callback;try {if (this.state === 'fulfilled') {const value = onFulfilled ? onFulfilled(this.value) : this.value;resolve(value);} else if (this.state === 'rejected') {const value = onRejected ? onRejected(this.value) : this.value;reject(value);}} catch (error) {reject(error);}}
}

添加 then 方法

Promise 的 then 方法用于指定完成和失敗時的回調函數。在我們手動實現的 Promise 中,我們將回調函數包裝成一個對象,保存在 Promise 的 callbacks 數組中。

class MyPromise {// ...then(onFulfilled, onRejected) {return new MyPromise((resolve, reject) => {const callback = {onFulfilled,onRejected,resolve,reject,};if (this.state === 'pending') {this.callbacks.push(callback);} else {this.executeCallback(callback);}});}
}

錯誤處理和鏈式調用

為了實現錯誤處理和鏈式調用,我們需要在 then 方法中返回一個新的 Promise 對象,以便將每個 then 方法的返回值傳遞給下一個 then 方法。

class MyPromise {// ...then(onFulfilled, onRejected) {return new MyPromise((resolve, reject) => {const callback = {onFulfilled,onRejected,resolve,reject,};if (this.state === 'pending') {this.callbacks.push(callback);} else {setTimeout(() => {this.executeCallback(callback);});}});}catch(onRejected) {return this.then(null, onRejected);}
}

完成最終的 Promise 實現

最終,我們的手寫 Promise 實現如下:

class MyPromise {constructor(executor) {// ...executor(resolve, reject);}// ...then(onFulfilled, onRejected) {return new MyPromise((resolve, reject) => {const callback = {onFulfilled,onRejected,resolve,reject,};if (this.state === 'pending') {this.callbacks.push(callback);} else {setTimeout(() => {this.executeCallback(callback);});}});}catch(onRejected) {return this.then(null, onRejected);}
}

通過自己實現一個簡單的 Promise,我們更深入地理解了 Promise 的工作原理和常見用法。了解 Promise 的基本結構和方法之后,您將能夠更好地應用 Promise 來處理異步操作,提高代碼的可讀性和維護性。

請注意,這只是一個簡化版的 Promise 實現,真實的 Promise 還有更多復雜的特性和處理方式。為了生產環境中的實際項目,請使用現有的成熟 Promise 實現,如 JavaScript 中的原生 Promise

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

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

相關文章

什么是網站劫持

網站劫持是一種網絡安全威脅,它通過非法訪問或篡改網站的內容來獲取機密信息或者破壞計算機系統。如果您遇到了網站劫持問題,建議您立即聯系相關的安全機構或者技術支持團隊,以獲得更專業的幫助和解決方案。

探索 HTTPS:保障網絡通信的安全性

引言 HTTPS(HyperText Transfer Protocol Secure)是一種安全的通信協議,用于在網絡上安全地傳輸數據。它是基于 HTTP 協議的擴展,通過加密通信實現了數據的保護和安全性。 功能介紹 加密數據傳輸: 使用加密技術對數…

Prism框架快速注冊帶有特性標簽的類型

前言 最近用Prims框架,真的是懶得手動注冊各種類型,不利于團隊開發工作,各種dll強耦合,后期維護還麻煩,這次我們帶來了一個快速注冊的類來快速提高開發效率。重點用到的就是通過反射出dll里面的類型,然后根據特性或者類型過濾來完成快速注冊的功能。 代碼 using Prism…

Angular 進階之四:SSR 應用場景與局限

應用場景 內容豐富,復雜交互的動態網頁,對首屏加載有要求的項目,對 seo 有要求的項目(因為服務端第一次渲染的時候,已經把關鍵字和標題渲染到響應的 html 中了,爬蟲能夠抓取到此靜態內容,因此更…

【面試專題】MySQL篇①

1.MySQL中,如何定位慢查詢? ①介紹一下當時產生問題的場景(我們當時的一個接口測試的時候非常的慢,壓測的結果大概5秒鐘) ②我們系統中當時采用了運維工具( Skywalking ),可以監測出哪個接口…

PostgreSQL從小白到高手教程 - 第38講:數據庫備份

PostgreSQL從小白到專家,是從入門逐漸能力提升的一個系列教程,內容包括對PG基礎的認知、包括安裝使用、包括角色權限、包括維護管理、、等內容,希望對熱愛PG、學習PG的同學們有幫助,歡迎持續關注CUUG PG技術大講堂。 第38講&#…

running小程序重要技術流程文檔

一、項目文件說明: (注:getMyMoney無用已刪除) 二、重要文件介紹 1.reinfo.js:位于utils文件下,該文件封裝有統一的請求URL,和請求API同意封裝供頁面調用;調用時候需要在頁面上先…

【C語言】操作符詳解(一):進制轉換,原碼,反碼,補碼

目錄 操作符分類 2進制和進制轉換 2進制轉10進制 10進制轉2進制 2進制轉8進制和16進制 2進制轉8進制 2進制轉16進制 原碼、反碼、補碼 操作符分類 操作符中有一些操作符和二進制有關系,我們先鋪墊一下二進制的和進制轉換的知識。 2進制和進制轉換 其實我們經…

數據結構準備知識

struct(結構體) struct,或稱為結構體,是C語言中一種復合數據類型,它允許你將多個不同類型的數據項組合成一個單一的單位。這對于創建記錄或更復雜的數據結構非常有用。 結構體的定義語法如下: struct 結…

vertica主鍵列能插入重復值的處理辦法

問題描述 開發同事反饋在vertica中創建含主鍵列的表中插入重復數據時沒有進行校驗,插入重復值成功。經過測試著實可以插入重復值,這個坑有些不一樣。 創建表和插入語句如下: --創建表 CREATE TABLE dhhtest(ID VARCHAR(64) PRIMARY KEY );…

postgresql數據庫配置主從并配置ssl加密

1、先將postgresql數據庫主從配置好 參考:postgresql主從配置 2、在主節點配置ssl加密,使用navicat測試是否可以連接 參考:postgresql配置ssl 3、正常連接無誤后,將root.crt、server.crt、server.key復制到從數據庫節點的存儲…

使用Microsoft Dynamics AX 2012 - 5. 生產控制

生產控制的主要職責是生產成品。為了完成這項任務,制造業需要消耗物品和資源能力(人員和機械)。制造過程可能包括半成品的生產和庫存。半成品是指物品包括在成品材料清單中。 制造業的業務流程 根據公司的要求,您可以選擇申請Dy…

某馬點評——day04

達人探店 發布探店筆記 改一下&#xff0c;圖片保存路徑就可以直接運行測試了。 查看探店筆記 Service public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {Resourceprivate IUserService userService;Overridepublic Resu…

OpenCL學習筆記(二)手動編譯開發庫(win10+vs2019)

前言 有時需求比較特別&#xff0c;可能需要重新編譯opencl的sdk庫。本文檔簡單記錄下win10下&#xff0c;使用vs2019編譯的過程&#xff0c;有需要的小伙伴可以參考下 一、獲取源碼 項目地址&#xff1a;GitHub - KhronosGroup/OpenCL-SDK: OpenCL SDK 可以直接使用git命令…

一篇文章了解指針變量

字符指針變量 在指針的類型中我們知道有一種指針叫做字符指針 它的使用情況如下&#xff1a; #include<stdio.h> int main() {char pa w;char*p1&pa;*p1 a;printf("%c\n", *p1);return 0; } 在這段代碼當中&#xff0c;我們將‘w’字符的地址傳到了p…

vue3 自己寫一個月的日歷

效果圖 代碼 <template><div class"monthPage"><div class"calendar" v-loading"loading"><!-- 星期 --><div class"weekBox"><div v-for"(item, index) in dayArr" :key"index&q…

2.修改列名與列的數據類型

修改字段名與字段數據類型 1.修改字段名 有時&#xff0c;在我們建好一張表后會突然發現&#xff0c;哎呀&#xff01;字段名貌似寫錯了&#xff01;怎么辦&#xff1f;要刪了表再重新建一個新表嗎&#xff1f;還是要刪了這個字段再新建一個新的字段&#xff1f; 都不用&…

AIGC專題報告:生成式人工智能人人可用的新時代

今天分享的AIGC系列深度研究報告&#xff1a;《AIGC專題報告&#xff1a;生成式人工智能人人可用的新時代》。 &#xff08;報告出品方&#xff1a;埃森哲&#xff09; 報告共計&#xff1a;21頁 人工智能發展迎來新拐點 ChatGPT 正在喚醒全球對人工智能&#xff08;AI&…

蛇形矩陣

蛇形矩陣是由1開始的自然數依次排列成的一個矩陣上三角形。 例如&#xff0c;當輸入5時&#xff0c;應該輸出的三角形為&#xff1a; 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 輸入描述&#xff1a;輸入正整數N&#xff08;N不大于100&#xff09; 輸出描述&#xff1a;輸出一個N…

MySQL七 | 存儲引擎

目錄 存儲引擎 存儲引擎特點 存儲引擎選擇 Innodb與MyISAM區別 存儲引擎 默認存儲引擎:InnoDB show engines;#展示當前數據庫支持的存儲引擎 存儲引擎特點 特點InnoDBMyISAMMemory存儲限制64TB有有事務安全支持--鎖機制行鎖表鎖表鎖Btree鎖支持支持 支持 Hash索引--支…