Promise的自定义封装(用类方法)

深入理解promise底层源码有助于我们更好地理解promise。以下代码可以实现promise的基本功能。 

class Promise{// 构造方法constructor(executor){// 添加属性this.PromiseState = "pending";this.PromiseResult = null;this.callbacks = [];// 保存实例对象this的值const self = this; //self _this that// resolve函数function resolve(data) {// 判断状态if (self.PromiseState !== "pending") return;// 1.修改对象的状态(promiseState)self.PromiseState = "fulfilled"; //resolved// 2.设置对象结果值(PromiseResult)self.PromiseResult = data;// 调用成功的回调函数(定时器实现异步回调)setTimeout(()=>{self.callbacks.forEach((item) => {item.onResolved(data);});})}// reject函数function reject(data) {if (self.PromiseState !== "pending") return;// 1.修改对象的状态(promiseState)self.PromiseState = "rejected"; //resolved// 2.设置对象结果值(PromiseResult)self.PromiseResult = data;//执行失败的回调函数(定时器实现异步回调)setTimeout(()=>{self.callbacks.forEach((item) => {item.onRejected(data);});})}try {// 同步调用执行器函数executor(resolve, reject);} catch (e) {reject(e);}}// then方法then(onResolved,onRejected){const self = this;// 判断回调函数参数if(typeof onRejected !=='function'){onRejected=reason=>{throw reason}}if(typeof onResolved !=='function'){onResolved=value=>value}return new Promise((resolve, reject) => {// 封装函数function callback(type){try {//获得回调函数的执行结果let result = type(self.PromiseResult);// 判断if (result instanceof Promise) {//如果是Promise类型的对象result.then((v) => {resolve(v);},(r) => {reject(r);});} else {//结果的对象状态为成功resolve(result);}} catch (e) {reject(e);}}// 调用回调函数 PromiseStateif (this.PromiseState === "fulfilled") {// (定时器实现异步回调)setTimeout(()=>{callback(onResolved)})}if (this.PromiseState === "rejected") {// (定时器实现异步回调)setTimeout(()=>{callback(onRejected)})}// 判断pending状态if (this.PromiseState === "pending") {// 保存回调函数this.callbacks.push({onResolved: function () {callback(onResolved)},onRejected: function () {callback(onRejected)},});}});}// catch方法catch(onRejected){return this.then(undefined,onRejected)}// resolve方法static resolve(value){return new Promise((resolve,reject)=>{if(value instanceof Promise){value.then(v=>{resolve(v)},r=>{reject(r)})}else{resolve(value)}})}// reject方法static reject(reason){return new Promise((resolve,reject)=>{reject(reason)})}// all方法static all(promises){// 返回结果为promise对象return new Promise((resolve,reject)=>{// 声明变量let count=0;let arr=[]// 遍历for(let i=0;i<promises.length;i++){promises[i].then(v=>{// 得知对象的状态为成功// 每个promise对象都成功count++;// 将当前的promise对象成功的结果 存入到数组中arr[i]=vif(count===promises.length){// 修改状态resolve(arr)}},r=>{reject(r)})}})}// race方法static race(promises){return new Promise((resolve,reject)=>{for(let i=0;i<promises.length;i++){promises[i].then(v=>{resolve(v)},r=>{reject(r)})}})}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/47491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫-存储数据

EXCEL文件 openpyxl写文件 exce文件也被称为工作簿&#xff0c;其可以创建多个工作表。每个工作表是由很多个单元格组成。我们通过openpyxl来操作Excel文件。 安装 pip install openpyxl 要将内容写入Excel文件&#xff0c;首先要创建一个Excel表格&#xff0c;方法如下&…

c++图的基本操作

在C中&#xff0c;可以使用邻接矩阵或邻接表来表示图&#xff0c;并实现一系列基本的图操作&#xff0c;包括创建图、添加边、删除边、遍历图等。下面是关于图的基本操作的详细解释。 创建图&#xff1a; 使用邻接矩阵创建图&#xff1a;可以使用二维数组来表示邻接矩阵&#x…

RAG技术-为自然语言处理注入新动力

引言&#xff1a; 在自然语言处理&#xff08;NLP&#xff09;的领域中&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术以其独特的方式&#xff0c;正在改变我们与机器的交互方式。RAG技术结合了大语言模型的强大能力&#xff0c;使得机器在理解和…

MongoDB教程(九):java集成mongoDB

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、环境准…

SAPUI5基础知识15 - 理解控件的本质

1. 背景 经过一系列的练习&#xff0c;通过不同的SAPUI5控件&#xff0c;我们完成了对应用程序界面的初步设计&#xff0c;在本篇博客中&#xff0c;让我们一起总结下SAPUI5控件的相关知识点&#xff0c;更深入地理解SAPUI5控件的本质。 通常而言&#xff0c;一个典型UI5应用…

RocketMQ单结点安装/Dashboard安装

目录 1.安装NameServer 2.安装Broker 3.使用自带工具测试数据发送 4.使用DashBoard进行查看 5.关闭相关设备 前置条件&#xff1a;两台虚拟机CentOS Linux release 7.5.1804(ps:当然也可以都部署在一台机器上) RocketMq属于天生集群。需要同时启动nameServer和Broker进行…

go练习:图像

自定义 Image 类型&#xff0c;实现必要的方法并调用 pic.ShowImage。 Bounds 应当返回一个 image.Rectangle &#xff0c;例如 image.Rect(0, 0, w, h)。 ColorModel 应当返回 color.RGBAModel。 At 应当返回一个颜色。上一个图片生成器的值 v 对应于此次的 color.RGBA{v, …

CMMI认证是什么?做CMMI认证的必要条件?CMMI认证的重要性

CMMI&#xff08;Capability Maturity Model Integration&#xff09;认证&#xff0c;作为企业追求卓越软件工程实践的标志&#xff0c;其实现过程既严谨又复杂。首先&#xff0c;我们需要深入理解CMMI的核心理念&#xff0c;即持续的过程改进和成熟度提升。 为了实现CMMI认证…

redistemplate介绍与演示

redistemplate是一个用于在Redis中存储和检索数据的模板库。它提供了一组简单易用的函数和接口&#xff0c;使开发者能够更方便地使用Redis进行数据操作。 使用redistemplate&#xff0c;你可以实现以下功能&#xff1a; 存储和检索数据&#xff1a;redistemplate提供了存储和…

Lucene 索引文件详解:结构与工作原理

Lucene 索引文件详解&#xff1a;结构与工作原理 Apache Lucene 是一个强大的搜索引擎库&#xff0c;用于为大规模文本数据创建搜索和索引功能。Lucene 使用特定的文件格式来存储索引&#xff0c;以便高效地进行搜索。理解这些索引文件格式对于调优性能和解决潜在问题非常重要…

C++ 几何计算库

代码 #include <iostream> #include <list> #include <CGAL/Simple_cartesian.h> #include <CGAL/AABB_tree.h> #include <CGAL/AABB_traits.h> #include <CGAL/AABB_segment_primitive.h> #include <CGAL/Polygon_2.h>typedef CGAL…

每天一个数据分析题(四百三十二)- 假设检验

在假设检验问题中&#xff0c;原假设为H0 &#xff0c;给定显著水平为α&#xff0c;则关于假设检验的原理说法正确的是 A. 中心极限定理 B. 小概率事件 C. 置信区间 D. 正态分布的性质 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答…

线性代数|机器学习-P24加速梯度下降(动量法)

文章目录 1. 概述2. 引入3. 动量法梯度下降 1. 概述 我们之前学的最速梯度下降[线搜索方法] 公式如下&#xff1a; x k 1 x k − s k ∇ f ( x k ) \begin{equation} x_{k1}x_k-s_k\nabla f(x_k) \end{equation} xk1​xk​−sk​∇f(xk​)​​ 但对于这种方法来说&#xff…

助力数据记录:Connext的Historian功能启动指南

​ 在工业自动化领域&#xff0c;Connext以其全新的OPCUA数据采集解决方案为核心&#xff0c;不仅拥有超越传统的扩展功能&#xff0c;而且在多个行业中都得到了广泛的认证。Connext能够快速找出解决方案并迅速部署&#xff0c;整个过程不会影响到原有的生产。它的强大之处在于…

Android12 禁用adb

这种做法没有删除任何adb相关的东西&#xff0c;只是设置persist.sys.usb.config中的adb相关属性时添加宏控制。 userdebug版本一样可以禁用 添加宏开关 device/mediatek/mt6761/BoardConfig.mk # for adb ADB_ENABLE:false添加ro.adb.enabled属性 build/make/core/main.mk…

信创学习笔记(三),信创之操作系统OS思维导图

创作不易 只因热爱!! 热衷分享&#xff0c;一起成长! “你的鼓励就是我努力付出的动力” 一. 回顾信创CPU芯片 1. x86应用生态最丰富, 海光(3,5,7)授权较新,无桌面授权,多用于服务器 兆芯(ZX, KX, KH)授权较早期. 2. ARMv8移动端应用生态丰富, 华为鲲鹏(9) ,制裁中&#xff0c;…

基于python的三次样条插值原理及代码

1 三次样条插值 1.1 三次样条插值的基本概念 三次样条插值是通过求解三弯矩方程组&#xff08;即三次样条方程组的特殊形式&#xff09;来得出曲线函数组的过程。在实际计算中&#xff0c;还需要引入边界条件来完成计算。样条插值的名称来源于早期工程师制图时使用的细长木条&…

oracle 经营范围 设计

在Oracle数据库中设计经营范围通常涉及创建相关的数据库表来记录和管理经营范围内的数据。以下是一个简单的例子&#xff0c;展示了如何设计一个经营范围表&#xff1a; CREATE TABLE business_units (bu_id NUMBER PRIMARY KEY,bu_name VARCHAR2(100),parent_bu_id NUMBER,CO…

探索Node.js中的node-xlsx:将Excel文件解析为JSON

在Node.js开发中&#xff0c;处理Excel文件是一个常见需求&#xff0c;特别是在需要导入大量数据或生成报表的场景中。node-xlsx 是一个强大的库&#xff0c;它提供了Excel文件的解析和生成功能。本文将深入探讨 node-xlsx 的使用&#xff0c;并通过一个案例演示如何将Excel文件…