当前位置: 首页 > news >正文

MyPromise

class MyPromise{constructor(executor){this.state='pending';this.value=undefined;this.reason=undefined;this.onFulfilledCallbacks=[];this.onRejectedCallbacks=[];// 绑定 this,确保 resolve/reject 中的 this 指向实例this.resolve = this.resolve.bind(this);this.reject = this.reject.bind(this);try {executor(this.resolve, this.reject);} catch (error) {this.reject(error);}}resolve(value){if(this.state==='pending'){this.state='fulfilled';this.value=value;this.onFulfilledCallbacks.forEach(callback=>{setTimeout(()=>{callback(this.value);},0)})}}reject(reason){if(this.state==='pending'){this.state='rejected';this.reason=reason;this.onRejectedCallbacks.forEach(callback=>{setTimeout(()=>{callback(this.reason);},0)})}}then(onfulfiled,onrejected){onfulfiled=typeof onfulfiled==='function'?onfulfiled:(value)=>value;onrejected=typeof onrejected==='function'?onrejected:(reason)=>{throw reason};return new MyPromise((resolve,reject)=>{const handleFulfilled=(value)=>{try{const result=onfulfiled(value);resolve(result);}catch(error){reject(error)}}const handleRejected=(reason)=>{try{const result=onrejected(reason);resolve(result);}catch(error){reject(error)}}if(this.state==='fulfilled'){setTimeout(()=>{handleFulfilled(this.value)},0)}else if(this.state==='rejected'){setTimeout(()=>{handleRejected(this.reason)},0)}else{this.onFulfilledCallbacks.push(()=>{setTimeout(()=>{handleFulfilled(this.value)},0)})this.onRejectedCallbacks.push(()=>{setTimeout(()=>{handleRejected(this.reason)},0)})}})}catch(onRejected){return this.then(null,onRejected);}finally(onFinally){return this.then(value => MyPromise.resolve(onFinally()).then(() => value),reason => MyPromise.resolve(onFinally()).then(() => { throw reason }));}static resolve(value) {if (value instanceof MyPromise) {return value;}return new MyPromise(resolve => resolve(value));};static reject(reason) {return new MyPromise(null,reject => reject(reason));};// 添加 all 方法
    static all(promises) {return new MyPromise((resolve, reject) => {if (!Array.isArray(promises)) {return reject(new TypeError('Argument must be an array'));}if (promises.length === 0) {return resolve([]);}const results = [];let completedCount = 0;promises.forEach((promise, index) => {MyPromise.resolve(promise).then(value => {results[index] = value;completedCount++;if (completedCount === promises.length) {resolve(results);}},reject);});});}// 添加 race 方法
    static race(promises) {return new MyPromise((resolve, reject) => {if (!Array.isArray(promises)) {return reject(new TypeError('Argument must be an array'));}promises.forEach(promise => {MyPromise.resolve(promise).then(resolve, reject);});});}
}

 

http://www.jsqmd.com/news/51376/

相关文章:

  • 2025 智能印章产品推荐排行:云玺量子 AI 智能印章深度评测与标准解读
  • 【Springer出版 | 往届见刊后1个月内完成检索】第五届环境污染与治理国际学术会议 (ICEPG 2025)
  • 2025年11月审计事务所选择指南:资质认证与用户评价双维度对比
  • CF1823F Random Walk 题解
  • 基于LQR和PID控制算法的一级倒立摆MATLAB实现
  • 2025年11月北京装修公司推荐评测报告:从稳定性到AI能力的解决方案剖析
  • AT_arc198_b [ARC198B] Rivalry 个人题解
  • 2025Q4 天津装修推荐榜:尚客优 9.99 分登顶 全域适配洋房装修首选
  • 2025 年电商企业直播,金融企业直播,海外企业直播平台口碑推荐 微吼直播:15 年深耕数字化营销 华为全球直播供应商的全场景解决方案
  • 拉帮机全面评估与选购指南:2025年11月最新版TOP5推荐榜单
  • AT_abc412_e [ABC412E] LCM Sequence 个人题解
  • 2025 年企业年会直播,企业活动直播公司推荐 微吼:华为全球直播供应商 6400+CDN 节点支撑的高稳定活动直播平台
  • 一对一网课哪个平台好?2026 权威测评 + 高性价比榜单​
  • 2025 年医学企业直播,企业大会直播,企业展会直播公司推荐 微吼直播:44 项专利护航千万级并发 全场景数字化活动解决方案服务商
  • DP 入门
  • LeetCode 410 - 分割数组的最大值 - 实践
  • 2025年11月高新技术企业认定公司推荐:榜单分析与选择指南
  • 2025年11月数据标注平台推荐选择指南:基于实际需求的技术路线与成本考量
  • 2025 最新硫化仪厂家推荐排行榜:无转子 / 橡胶 / 门尼粘度仪硫化仪实力厂家技术与售后测评
  • 2025年11月取暖器品牌推荐选择指南:专业分析维度助力家庭精准决策
  • 109_尚硅谷_函数介绍和应用案例
  • 2025 年 11 月羽绒服厂家精选推荐榜:薄款/厚款/男款/女款/可水洗/复古款/潮流/街头风/休闲/运动/通勤/百搭,时尚设计与实用功能兼具的冬日穿搭首选
  • 2025年11月高新技术企业认定公司推荐:知名榜单与选择指南
  • 2025年厚壁钢管生产商权威推荐榜单:钢板卷钢管/非标钢管/不锈钢管源头厂家精选
  • AIGC降重指令全攻略:10个高效技巧助你论文快速过审
  • 2025年11月沈阳酒店推荐深度解析:核心价值点与专业维度评估
  • 2025 成型机厂家最新推荐排行榜:冷弯 / 粉末 / 光伏配套 / 门业设备权威榜单,源头厂家实力优选指南C 型槽 / 轻钢龙骨 / 电缆桥架 / 圆管成型机推荐
  • Linux写文件到windows共享文件夹
  • 基于维纳滤波器的语音去噪Matlab实现
  • 2025 年 11 月棒球帽品牌实力推荐榜:薄款厚款男女款可水洗,潮流百搭防晒抗皱,街头风复古甜美帅气款精选合集