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

js 手写promise

const PENDING = 'pending';
const FULFILLED = 'fulfilled';
const REJECTED = 'rejected';class MyPromise {#status = PENDING;#result = undefined;#handler = undefined;constructor(executor) {// 不能写在外面,因为this指向会出问题const resolve = (data) => {this.#changeState(FULFILLED, data);}const reject = (err) => {this.#changeState(REJECTED, err);}try {executor(resolve, reject);} catch(err) {reject(err); }}#changeState (status, result) {if (this.#status !== PENDING) {return;}this.#status = status;this.#result = result;this.#run();}#run () {console.log(this, this.#handler);if (this.status === PENDING) {return;}const { onFulfilled, onRejected, resolve, reject } = this.#handler;// 回调不是函数,那么将当前的promise状态透传// 回调是函数,将函数执行返回值作为新的值传递,状态变为成功,执行过程报错,那么状态就为失败if(this.#status === FULFILLED) {if (typeof onFulfilled === 'function') {try {const res = onFulfilled(this.#result);resolve(res);} catch (err) {reject(err);}} else {resolve(this.#result);}} else {if (typeof onRejected === 'function') {try {const res = onRejected(this.#result);resolve(res);} catch (err) {reject(err);}} else {reject(this.#result);}}}then(onFulfilled, onRejected) {return  new MyPromise((resolve, reject) => {this.#handler = { onFulfilled, onRejected, resolve, reject };this.#run();});}
}const p = new Promise((resolve, reject) => {// setTimeout(() => {reject(222);// }, 0);// resolve(111);// throw 123;// setTimeout(() => {//     throw 123;  // 异步错误捕获不到,Promise也是一样// }, 0);
});p.then((res) => {console.log('成功1', res);
}, (err) => {console.log('失败1', err);return 333;
}).then(1, (err) => {console.log('失败2', err);
}).then((res) => {console.log('成功3', res);
}, (err) => {console.log('失败3', err);
}).then((res) => {console.log('成功4', res);
}, (err) => {console.log('失败4', err);
});const p1 = new MyPromise((resolve, reject) => {// setTimeout(() => {reject(222);// }, 0);// resolve(111);// throw 123;// setTimeout(() => {//     throw 123;  // 异步错误捕获不到,Promise也是一样// }, 0);
});p1.then((res) => {console.log('成功1', res);
}, (err) => {console.log('失败1', err);return 333;
}).then(1, (err) => {console.log('失败2', err);
}).then((res) => {console.log('成功3', res);
}, (err) => {console.log('失败3', err);
}).then((res) => {console.log('成功4', res);
}, (err) => {console.log('失败4', err);
});

其他静态方法

	static resolve(value) {return new MyPromise((resolve) => resolve(value));}static reject(reason) {return new MyPromise((resolve, reject) => reject(reason));}static all(promises) {// 问题关键: 什么时候要执行resolve, 什么时候要执行rejectreturn new MyPromise((resolve, reject) => {const values = [];promises.forEach((promise) => {promise.then((res) => {values.push(res);if (values.length === promises.length) {resolve(values);}},(err) => {reject(err);},);});});}static allSettled(promises) {return new MyPromise((resolve) => {const results = [];promises.forEach((promise) => {promise.then((res) => {results.push({ status: PROMISE_STATUS_FULFILLED, value: res });if (results.length === promises.length) {resolve(results);}},(err) => {results.push({ status: PROMISE_STATUS_REJECTED, value: err });if (results.length === promises.length) {resolve(results);}},);});});}static race(promises) {return new MyPromise((resolve, reject) => {promises.forEach((promise) => {promise.then(resolve, reject);});});}static any(promises) {// resolve必须等到有一个成功的结果// reject所有的都失败才执行rejectconst reasons = [];return new MyPromise((resolve, reject) => {promises.forEach((promise) => {promise.then(resolve, (err) => {reasons.push(err);if (reasons.length === promises.length) {reject(new AggregateError(reasons));}});});});}
http://www.xdnf.cn/news/9622.html

相关文章:

  • 专栏更新通知
  • Python 科学计算有哪些提高运算速度的技巧
  • 力扣——1.两数之和
  • 【论文阅读】User Diverse Preference Modeling by Multimodal Attentive Metric Learning
  • 【笔记】修改abu量化本地部署数据文件夹目录
  • OpenCV CUDA模块直方图计算------用于在 GPU 上执行对比度受限的自适应直方图均衡类cv::cuda::CLAHE
  • Python 的 `next()`函数
  • 数字化回归本质:第一性原理驱动的制造业转型与AI+云PLM系统实践
  • LeetCode-数组技巧题目
  • 影刀RPA-20-高级操作题2
  • 后端思维之高并发处理方案
  • 使用LSTM对销售数据进行预测
  • 简乐 1.4.0 | 非常简洁 无损下载 畅听全网
  • 聊一聊 C# NativeAOT 多平台下的函数导出
  • Milvus向量Search查询综合案例实战(下)
  • Telnet 命令详解
  • 深度学习---注意力机制(Attention Mechanism)
  • docker 网络-用户定义网络
  • 【OCSA 2025】征稿通道已经开启​
  • 【连接器专题】 EIA-364 系列标准的完整列表
  • 加减数值策略
  • 【笔记】修复ImportError: cannot import name ‘Mapping‘ from ‘collections‘
  • DeepSpeed常见面试问题
  • PMO价值重构:从项目管理“交付机器”到“战略推手”
  • 消防应急装备管理:打造消防营区智能仓储
  • 36. 编写异步webdriver接口请求客户端
  • Vector - VT System - 板卡_VT板卡使用介绍_08
  • 【LangGraph】智能体工作流的新基石
  • uniapp小程序开发,判断跳转页面是否需要登录方法封装
  • 网站每天几点更新,更新频率是否影响网站收录