自定义手写Promise

简介: 手写函数版和类版Promise

函数版:
function diyPromise(executor) {

//添加属性
this.PromiseState = 'pending';
this.PromiseResult = null;
this.callbacks = [];
//保存实例对象 this的值为diyPromise
const self = this;
//reslove函数
function resolve(data) {
    //设置promise对象状态只能由pending到其他状态且只修改一次
    if (self.PromiseState !== 'pending') return;
    //修改对象的状态
    self.PromiseState = 'resolved';
    //修改对象结果值
    self.PromiseResult = data
        //调用成功的回调函数
    setTimeout(() => {
        self.callbacks.forEach(item => {
            item.onResolved(data)
        })
    })

}
//reject函数
function reject(data) {
    //设置promise对象状态只能由pending到其他状态且只修改一次
    if (self.PromiseState !== 'pending') return;
    //修改对象的状态
    self.PromiseState = 'rejected';
    //修改对象结果值
    self.PromiseResult = data
        //调用失败的回调函数
    setTimeout(() => {
        self.callbacks.forEach(item => {
            item.onRejected(data)
        })
    })

}

//同步调用 [执行器函数]
try {
    executor(resolve, reject);
} catch (error) {
    reject(error);
}

}

//添加then方法回调
diyPromise.prototype.then = function(onResolved, onRejected) {
//判断回调函数参数
if (typeof onRejected !== 'function') {
onRejected = reason => {
throw reason;
}
}
if (typeof onResolved !== 'function') {
onResolved = value => value;
// value = {return value}
}
//保存实例对象的值
const self = this;
return new diyPromise((resolve, reject) => {
//封装函数
function callback(type) {
try {
//获取回调函数的执行结果
let result = type(self.PromiseResult);
//判断 获取的执行结果是否是Promise实例
if (result instanceof diyPromise) {
//如果是Promise类型的对象
result.then(v => {
resolve(v)
}, r => {
reject(r);
})
} else {
//如果是非Promise对象 更改Promise状态为成功
resolve(result);
}
} catch (error) {
reject(error)
}
}
//调用回调函数
if (this.PromiseState === 'resolved') {
setTimeout(() => {
callback(onResolved)
})
}

        if (this.PromiseState === 'rejected') {
            setTimeout(() => {
                callback(onRejected);
            })
        }
        //判断 pending状态
        if (this.PromiseState === 'pending') {
            //保存回调函数
            this.callbacks.push({
                onRejected: function() {
                    callback(onResolved)
                },

                onResolved: function() {
                    callback(onRejected)
                }
            })
        }
    })
}
//添加catch方法

diyPromise.prototype.catch = function(onRejected) {
return this.then(undefined, onRejected);
}

//添加resolve方法
diyPromise.resolve = function(value) {
//返回Promise对象
return new diyPromise((resolve, reject) => {
if (value instanceof diyPromise) {
value.then(v => {
resolve(v);
}, r => {
reject(r);
})
} else {
//状态设置为成功
resolve(value);
}
})
}
//添加reject方法
diyPromise.reject = function(reason) {
return new diyPromise((resolve, reject) => {
reject(reason);
})
}
//添加all方法
diyPromise.all = function(promises) {
//返回结果为promise对象
return new diyPromise((resolve, reject) => {
//声明变量
let count = 0;
let arr = [];
for (let i = 0; i < promises.length; i++) {
promises[i].then(v => {
//得知对象的状态是成功
//每个promise对象都成功
count++;
//将当前promise对象成功的结果存入到 集合中
arr[i] = v;
//判断 是否所有的promise都成功了
if (count === promises.length) {
//修改状态
resolve(arr);
}
}, r => {
reject(r);
});
}
})
}
//添加rece方法
diyPromise.race = function(promises) {
return new diyPromise((resolve, reject) => {
// // for (let i = 0; i < promises.length; i++) {
// promises[i].then(v => {
// //修改返回对象状态为 [成功]
// resolve(v);
// }, r => {
// //修改返回对象状态为 [失败]
// reject(r);
// })

    // }
    for (let key of promises) {
        key.then(v => {
            //修改返回对象状态为 [成功]
            resolve(v);
        }, r => {
            //修改返回对象状态为 [失败]
            reject(r);
        })
    }
})

}

类版:
class diyPromise {
constructor(executor) {
//添加属性
this.PromiseState = 'pending';
this.PromiseResult = null;
this.callbacks = [];
//保存实例对象 this的值为diyPromise
const self = this;
//reslove函数
function resolve(data) {
//设置promise对象状态只能由pending到其他状态且只修改一次
if (self.PromiseState !== 'pending') return;
//修改对象的状态
self.PromiseState = 'resolved';
//修改对象结果值
self.PromiseResult = data
//调用成功的回调函数
setTimeout(() => {
self.callbacks.forEach(item => {
item.onResolved(data)
})
})

    }
    //reject函数
    function reject(data) {
        //设置promise对象状态只能由pending到其他状态且只修改一次
        if (self.PromiseState !== 'pending') return;
        //修改对象的状态
        self.PromiseState = 'rejected';
        //修改对象结果值
        self.PromiseResult = data
            //调用失败的回调函数
        setTimeout(() => {
            self.callbacks.forEach(item => {
                item.onRejected(data)
            })
        })

    }

    //同步调用 [执行器函数]
    try {
        executor(resolve, reject);
    } catch (error) {
        reject(error);
    }
}
then(onResolved, onRejected) {
    //判断回调函数参数
    if (typeof onRejected !== 'function') {
        onRejected = reason => {
            throw reason;
        }
    }
    if (typeof onResolved !== 'function') {
        onResolved = value => value;
        // value = {return value}
    }
    //保存实例对象的值
    const self = this;
    return new diyPromise((resolve, reject) => {
        //封装函数
        function callback(type) {
            try {
                //获取回调函数的执行结果
                let result = type(self.PromiseResult);
                //判断 获取的执行结果是否是Promise实例
                if (result instanceof diyPromise) {
                    //如果是Promise类型的对象
                    result.then(v => {
                        resolve(v)
                    }, r => {
                        reject(r);
                    })
                } else {
                    //如果是非Promise对象 更改Promise状态为成功
                    resolve(result);
                }
            } catch (error) {
                reject(error)
            }
        }
        //调用回调函数
        if (this.PromiseState === 'resolved') {
            setTimeout(() => {
                callback(onResolved)
            })
        }

        if (this.PromiseState === 'rejected') {
            setTimeout(() => {
                callback(onRejected);
            })
        }
        //判断 pending状态
        if (this.PromiseState === 'pending') {
            //保存回调函数
            this.callbacks.push({
                onRejected: function() {
                    callback(onResolved)
                },

                onResolved: function() {
                    callback(onRejected)
                }
            })
        }
    })
}
catch (onRejected) {
    return this.then(undefined, onRejected);
}
static resolve(value) {
        //返回Promise对象
        return new diyPromise((resolve, reject) => {
            if (value instanceof diyPromise) {
                value.then(v => {
                    resolve(v);
                }, r => {
                    reject(r);
                })
            } else {
                //状态设置为成功
                resolve(value);
            }
        })
    }
    //添加reject方法
static reject(reason) {
        return new diyPromise((resolve, reject) => {
            reject(reason);
        })
    }
    //添加all方法
static all(promises) {
        //返回结果为promise对象
        return new diyPromise((resolve, reject) => {
            //声明变量
            let count = 0;
            let arr = [];
            for (let i = 0; i < promises.length; i++) {
                promises[i].then(v => {
                    //得知对象的状态是成功 
                    //每个promise对象都成功
                    count++;
                    //将当前promise对象成功的结果存入到 集合中
                    arr[i] = v;
                    //判断 是否所有的promise都成功了
                    if (count === promises.length) {
                        //修改状态
                        resolve(arr);
                    }
                }, r => {
                    reject(r);
                });
            }
        })
    }
    //添加rece方法
static race(promises) {
    return new diyPromise((resolve, reject) => {
        // // for (let i = 0; i < promises.length; i++) {
        //     promises[i].then(v => {
        //         //修改返回对象状态为 [成功]
        //         resolve(v);
        //     }, r => {
        //         //修改返回对象状态为 [失败]
        //         reject(r);
        //     })

        // }
        for (let key of promises) {
            key.then(v => {
                //修改返回对象状态为 [成功]
                resolve(v);
            }, r => {
                //修改返回对象状态为 [失败]
                reject(r);
            })
        }
    })
}

}

相关文章
|
9月前
|
缓存 编解码 并行计算
《AMD显卡游戏适配手册:解决画面闪烁、着色器编译失败的核心技术指南》
本文聚焦游戏跨显卡适配中的典型痛点,针对NVIDIA显卡运行流畅、AMD显卡却出现画面闪烁、着色器编译失败等问题,深度拆解底层成因与根治方案。文章指出,问题核心源于AMD与NVIDIA的硬件架构(SIMD/SIMT)、指令集支持、驱动优化方向的本质差异,以及开发时单一显卡适配的思维惯性。通过驱动版本精准选型与残留清理、着色器编译规则降级兼容与分卡预编译、纹理压缩格式与渲染设置针对性调整、双显卡同步测试与长效迭代体系搭建等六大核心逻辑,提供从底层技术优化到实操落地的全流程指南。
761 7
|
5月前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+深度学习+人工智能+算法模型+图像识别+2026原创
【果蔬识别系统】Python+深度学习+人工智能+算法模型+图像识别+2026原创
220 1
【果蔬识别系统】Python+深度学习+人工智能+算法模型+图像识别+2026原创
|
4月前
|
人工智能 JSON 前端开发
用 GitLab MCP Tool 重做代码协作,顺手记下 DMXAPI
本文探讨GitLab MCP Tool如何将大模型接入真实工程上下文——不再依赖人工拼凑信息,而是让模型按需、分步、可验证地读取Issue、MR、CI日志等分散数据,构建“可追溯的推理链”。核心价值在于提升判断可信度,而非替代编码。(239字)
|
5月前
|
人工智能 网络协议 API
零基础阿里云轻量服务器部署OpenClaw保姆级图文教程|iMessage接入与避坑指南
2026年,OpenClaw(原Clawdbot、Moltbot,社区昵称“小龙虾”)已成为本地AI自动化与消息通道集成的首选工具,尤其适合追求**隐私可控**与**多端联动**的用户。本文面向**零基础新手**,以**阿里云轻量应用服务器**为核心部署载体,完整覆盖**从零到上线**的全流程:从服务器选购、镜像部署、端口配置,到**阿里云千问大模型API**与**免费Coding Plan API**的接入,再到**iMessage通道打通**(Mac+iPhone端),最后梳理90%新手会踩的**避坑指南**与**常见问题解决方案**。
339 7
|
Shell 数据安全/隐私保护 Python
微信虚拟摄像头插件,QQ虚拟相机拍摄录像工具,替换虚拟视频聊天软件
完整的虚拟摄像头实现方案,包含多个模块的代码实现。这个项目可以模拟摄像头设备,并在微信/QQ视频
|
人工智能 计算机视觉
HarmonyOS NEXT AI基础视觉服务-背景替换
这是一个基于AI基础视觉服务的背景替换案例,通过调用设备相册选择图片并智能分割主体,支持动态更换背景颜色。主要步骤包括:1) 导入模块与定义组件;2) 实现图片选择与格式转换;3) 使用`subjectSegmentation.doSegmentation`接口完成主体分割;4) 通过随机RGB值实现背景色动态更换。代码结构清晰,功能完整,适合学习AI图像处理技术。
HarmonyOS NEXT AI基础视觉服务-背景替换
|
消息中间件 缓存 NoSQL
如何解决缓存雪崩?
缓存雪崩是指大量缓存同时失效,导致请求直接冲击数据库,可能引发系统崩溃。其核心解决思路是**避免缓存集中失效或服务不可用**,并通过多层防护机制降低数据库压力。主要措施包括:为缓存key设置**随机过期时间**、按业务分组设置不同过期策略、对热点数据设置**永不过期**;通过**缓存集群部署**提升服务可用性;在数据库层进行**限流、读写分离和扩容**;并结合**本地缓存、熔断降级、缓存预热、持久化恢复**等手段,构建多级防护体系,确保系统稳定运行。
477 0
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
深度ai学术-从全网文献搜索到免费文献AI解析
深度AI学术(scholar.aisciresgo.com)打通科研全流程:全网智能搜索、免费获取文献、AI深度解析与精准翻译,一站式解决“搜不到、下不了、读不完”难题,助力研究者高效创新,开启智能科研新范式。
1011 1
|
10月前
|
人工智能 Cloud Native 自然语言处理
拔俗AI智能体服务开发:你的7x24小时数字员工,让企业效率飙升的秘密武器
在“人效为王”时代,企业面临服务响应慢、成本高、协同难等痛点。阿里云AI智能体以自主决策、多模态交互、持续学习三大引擎,打造永不疲倦的“数字员工”,实现7×24小时高效服务,助力企业降本增效、驱动创新增长。(238字)
657 0