js手动实现Promise;JS实现promise

news/2024/11/8 17:03:08/

Promise的实现主要有以下几个方法:

构造函数 - 创建一个Promise实例。
then() - 处理成功和失败的回调函数,并返回一个新的Promise实例。
catch() - 处理Promise的reject状态,并返回一个新的Promise实例。
resolvePromise() - 根据Promise链式调用的结果,决定是否继续执行。

class MyPromise {constructor(executor) {this.status = 'pending';this.value = undefined;this.reason = undefined;this.onFulfilledCallbacks = [];this.onRejectedCallbacks = [];const resolve = (value) => {if (this.status === 'pending') {this.status = 'fulfilled';this.value = value;this.onFulfilledCallbacks.forEach((callback) => callback(this.value));}};const reject = (reason) => {if (this.status === 'pending') {this.status = 'rejected';this.reason = reason;this.onRejectedCallbacks.forEach((callback) => callback(this.reason));}};try {executor(resolve, reject);} catch (error) {reject(error);}}then(onFulfilled, onRejected) {onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : (value) => value;onRejected = typeof onRejected === 'function' ? onRejected : (reason) => { throw reason };const promise2 = new MyPromise((resolve, reject) => {if (this.status === 'fulfilled') {setTimeout(() => {try {const x = onFulfilled(this.value);this.resolvePromise(promise2, x, resolve, reject);} catch (error) {reject(error);}}, 0);} else if (this.status === 'rejected') {setTimeout(() => {try {const x = onRejected(this.reason);this.resolvePromise(promise2, x, resolve, reject);} catch (error) {reject(error);}}, 0);} else if (this.status === 'pending') {this.onFulfilledCallbacks.push((value) => {setTimeout(() => {try {const x = onFulfilled(value);this.resolvePromise(promise2, x, resolve, reject);} catch (error) {reject(error);}}, 0);});this.onRejectedCallbacks.push((reason) => {setTimeout(() => {try {const x = onRejected(reason);this.resolvePromise(promise2, x, resolve, reject);} catch (error) {reject(error);}}, 0);});}});return promise2;}catch(onRejected) {return this.then(null, onRejected);}resolvePromise(promise2, x, resolve, reject) {if (promise2 === x) {reject(new TypeError('Chaining cycle detected'));}let called = false;if (x !== null && (typeof x === 'object' || typeof x === 'function')) {try {const then = x.then;if (typeof then === 'function') {then.call(x, (y) => {if (called) return;called = true;this.resolvePromise(promise2, y, resolve, reject);}, (r) => {if (called) return;called = true;reject(r);});} else {resolve(x);}} catch (error) {if (called) return;called = true;reject(error);}} else {resolve(x);}}
}

http://www.ppmy.cn/news/665110.html

相关文章

如何在多个 Linux 服务器上运行多个命令

动动发财的小手,点个赞吧! 如果你正在管理多台 Linux 服务器,并且你想在所有 Linux 服务器上运行多个命令,但你不知道该怎么做。不用担心,在这个简单的服务器管理指南[1]中,我们将向您展示如何在多个 Linux…

集成灶如何选?厨房集成灶十大排名榜集成灶大盘点,看完再买不迟

集成灶属于厨电行业的新兴产品,市场潜力巨大,每年以20%以上的速度增长,远远大于其它家电行业。那么厨房集成灶十大排名中,哪个集成灶质量比较好?适合自己的集成灶该如何选择?让我们一起了解,排名…

集成灶可以做开放式厨房吗?618在即 森歌优惠再度升级

前段时间有朋友问过我一个问题:“集成灶可以做开放式厨房吗?”通过这个问题,我发现有好多朋友其实只听说过集成灶不错,但是具体功能特点和优势,了解的其实并不透彻。于是我决定总结一些集成灶选购指南,帮助…

集成灶品牌全国前十名——森歌集成灶,给你新春第一份好彩头

集成灶品牌全国前十名都有哪些呢?我的印象里,森歌、亿田、帅丰这些品牌都还蛮靠前的。不过性价比最高的,其实还是森歌集成灶。森歌集成灶无论是从外观上、还是性能上,都比较有优势。我新买的房子,就入手的森歌A8ZK蒸烤…

集成灶十大知名品牌排名哪个好?森歌双11送羊毛,快薅

总有一些东西,错过就会后悔,比如双11的羊毛,不薅肯定会后悔!双十一已经来袭,正是厨电家具剁手之时。集成灶作为高效厨电家具,深受广大群众的好评,繁杂的品种更是让人眼花缭乱,集成灶…

集成灶十大品牌的领跑者,森歌用实力印证品牌影响力

集成灶作为厨电市场的一匹黑马,近几年来发展极为迅猛!相关数据显示,集成灶每年以20%以上的速度增长,市场潜力巨大,行业前景不可估量。2021年,集成灶市场竞争日益激烈,各大知名品牌都开始了不同程…

集成灶品牌推荐?一线品牌森歌集成灶,匠心品质,中国新厨房

集成灶品牌推荐什么好?这就要从多重角度全方位考虑了。近年来,集成灶行业发展迅猛,成为厨电市场的一匹黑马,越来越多的家庭热衷在厨房安装集成灶。究其原因,一方面是经济收入增加后,家庭的消费升级&#xf…

SQL-每日一题【180.连续出现的数字】

题目 表:Logs 编写一个 SQL 查询,查找所有至少连续出现三次的数字。 返回的结果表中的数据可以按 任意顺序 排列。 查询结果格式如下面的例子所示: 示例 1: 解题思路 1.要查询至少连续出现三次的数字,则可以转化为(…