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

面试手写 Promise:链式 + 静态方法全实现

ES5 语法 实现一个 符合 Promise/A+ 规范 的完整 Promise,附 Promise.all/race/finally 等静态方法,面试手写无压力。


一、手写核心 Promise(符合 A+)

1. 结构

const PENDING = 'pending';
const FULFILLED = 'fulfilled';
const REJECTED = 'rejected';function MyPromise(executor) {this.state = PENDING;this.value = undefined;this.reason = undefined;this.onFulfilledCallbacks = [];this.onRejectedCallbacks = [];const resolve = value => {if (this.state === PENDING) {this.state = FULFILLED;this.value = value;this.onFulfilledCallbacks.forEach(fn => fn());}};const reject = reason => {if (this.state === PENDING) {this.state = REJECTED;this.reason = reason;this.onRejectedCallbacks.forEach(fn => fn());}};try {executor(resolve, reject);} catch (err) {reject(err);}
}

2. then 方法(链式核心)

MyPromise.prototype.then = function (onFulfilled, onRejected) {onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : val => val;onRejected = typeof onRejected === 'function' ? onRejected : err => { throw err; };return new MyPromise((resolve, reject) => {const handle = () => {try {const result = this.state === FULFILLED? onFulfilled(this.value): onRejected(this.reason);resolvePromise(result, resolve, reject);} catch (err) {reject(err);}};if (this.state === PENDING) {this.onFulfilledCallbacks.push(handle);this.onRejectedCallbacks.push(handle);} else {setTimeout(handle, 0);}});
};function resolvePromise(result, resolve, reject) {if (result instanceof MyPromise) {result.then(resolve, reject);} else {resolve(result);}
}

二、静态方法全家桶

1. Promise.resolve / reject

MyPromise.resolve = value => new MyPromise(resolve => resolve(value));
MyPromise.reject = reason => new MyPromise((_, reject) => reject(reason));

2. Promise.all(并发等待)

MyPromise.all = function (promises) {return new MyPromise((resolve, reject) => {let count = 0;const results = [];promises.forEach((p, i) => {MyPromise.resolve(p).then(val => {results[i] = val;if (++count === promises.length) resolve(results);},reject);});});
};

3. Promise.race(谁先完成用谁)

MyPromise.race = function (promises) {return new MyPromise((resolve, reject) => {promises.forEach(p => MyPromise.resolve(p).then(resolve, reject));});
};

4. Promise.finally(无论成功失败都执行)

MyPromise.prototype.finally = function (callback) {return this.then(val => MyPromise.resolve(callback()).then(() => val),err => MyPromise.resolve(callback()).then(() => { throw err; }));
};

三、完整测试用例

// 1. 基本链式
new MyPromise(resolve => resolve(1)).then(val => val + 1).then(val => console.log(val)); // 2// 2. 并发
MyPromise.all([new MyPromise(resolve => setTimeout(() => resolve('a'), 100)),new MyPromise(resolve => setTimeout(() => resolve('b'), 200))
]).then(console.log); // ['a', 'b']
http://www.dtcms.com/a/350186.html

相关文章:

  • 扣子智能体商业化卡在哪?井云系统自动化交易+私域管理,闭环成交全流程拆解
  • 3491定期复盘代码实现设计模式的忌假应用
  • 使用Docker配置Redis Stack集群的步骤
  • React 19 与 Next.js:利用最新 React 功能
  • SQL性能调优
  • HTTP、HTTPS 与 WebSocket 详解
  • UDS诊断案例-新能源汽车电池管理系统(BMS)诊断
  • Git提交流程与最佳实践
  • debug kernel 的一些trace的方法
  • 嵌入式Linux内核编译与配置
  • GraphRAG
  • 掌握C++ std::invoke_result_t:类型安全的函数返回值提取利器
  • VSCode远程连接阿里云ECS服务器
  • ABB机器人焊接混合气节气阀
  • Chrome GPU 加速优化配置(前端 3D 可视化 / 数字孪生专用)
  • LangChain4J-(2)-高阶API与低阶API
  • 从人工巡检到AI预警:智慧工地如何用技术重构施工安全体系
  • Dubbo3.3 Idea Maven编译命令
  • 指纹手机技术支持体系:从核心技术到场景化落地保障
  • (四十六)深度解析领域特定语言(DSL)第八章——语法分析器组合子:案例实现(Part2)
  • Spring Boot 集成 Eclipse Mosquitto
  • 2025生成式引擎优化(GEO)技术研究报告:技术演进、行业应用与服务商能力选择指南
  • 【小增长电商技术分享】电商支付宝批量转账工具技术测评:架构特性、合规风险与选型方法论,支付宝官方|小增长|云方付|易推客省心返
  • 深度学习——神经网络简单实践(在乳腺癌数据集上的小型二分类示例)
  • 深度学习入门:从概念到实战,用 PyTorch 轻松上手
  • 【科研绘图系列】R语言浮游植物生态数据的统计与可视化
  • Java 图像处理传 JNI 到 C++(OpenCV):两种高效实现方式对比
  • Element-ui icon鼠标移入显示提示(已解决)
  • C++高级特性与设计模式答案
  • 迭代器设计模式