手写Promise自行封装 简化版与完整版

news/2024/7/6 13:38:15 标签: 前端, ecmascript

Promise 简化版实现 resolve reject throw回调

// 原生promise
let p = new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve('OK')
    },1000)
})
// 自定义Promise  简化版实现 resolve reject throw回调
function Promise(executor){
    //添加属性
    this.PromiseState = 'pending'
    this.PromiseResult = null
    //保存实例对象的this值  避免指向window
    const self = this
    // 声明属性保持回调函数
    this.callbacks = []
    function resolve(data){
        // 修改promise状态(promiseState)
        self.PromiseState = 'fulfilled'// fulfilled
        //设置结果值(promiseResult)
        self.PromiseResult = data
    }
    function reject(data){
        self.PromiseState = 'rejected'
        //设置结果值(promiseResult)
        self.PromiseResult = data
    }
    try{
        //执行器函数内部同步调用
        executor(resolve,reject)
    }catch(e){
        //抛出异常时 修改promise对象状态
        reject(e)
    }
}

promise完整版实现

// 对promise重复代码的封装
// 原生promise
let p = new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve('OK')
    },1000)
})
p.then(value=>{
    console.log(value)
},reason=>{
    console.log(reason)
})

p.catch(reason=>{
    console.warn(reason)
})
// 自定义Promise
function Promise(executor){
    //添加属性
    this.PromiseState = 'pending'
    this.PromiseResult = null
    //保存实例对象的this值  避免指向window
    const self = this
    // 声明属性保持回调函数
    this.callbacks = []
    function resolve(data){
        // 判断状态
        if(self.PromiseState !== "pending"){
            return;
        }
        // 修改promise状态(promiseState)
        self.PromiseState = 'fulfilled'// fulfilled
        //设置结果值(promiseResult)
        self.PromiseResult = data
        //执行异步pending成功的回调
        //if(self.callback.onResolved){
        //   self.callback.onResolved(data)
        //}
        self.callbacks.forEach(item=>{
            item.onResolved(data)
        })
    }
    function reject(data){
        if(self.PromiseState !== "pending")return;
        // 修改promise状态(promiseState)
        self.PromiseState = 'rejected'
        //设置结果值(promiseResult)
        self.PromiseResult = data
        //执行异步pending成功的回调
        //if(self.callback.onRejected){
        //self.callback.onRejected(data)
        //}
        self.callbacks.forEach(item=>{
            item.onRejected(data)
        })
    }
    try{
        //执行器函数内部同步调用
        executor(resolve,reject)
    }catch(e){
        //抛出异常时 修改promise对象状态
        reject(e)
    }
}
//添加then方法
Promise.prototype.then= function(onResolve,onRejected){
    const self = this
    if(typeof onRejected !== 'function'){
        onRejected = reason=>{
            throw reason
        }
    }
    
    if(typeof onResolved !== 'function'){
        onResolved = value=>{
            return value
        } //  也可以简写为 onResolved = value => value
    }
    return new Promise((resolve,reject)=>{
        // 封装函数
        function callback(type){
            try{
                let result = type(self.PromiseResult)
                if(result instanceof Promise){
                    result.then(v=>{
                        resolve(v)
                    },r=>{
                        reject(r)
                    })
                }else{
                    resolve(result)
                }}catch(e){
                    reject(e)
                }
        }
        
        //调用回调函数
        if(this.PromiseState == 'fulfilled'){
            //获取回调函数的执行结果
            callback(onResolved)
        }
        if(this.PromiseState == 'rejected'){
            onRejected(this.PromiseResult)
        }
        //判断异步pending状态
        if(this.PromiseState == 'pending'){
            //保存回调函数
            this.callbacks.push({
                onResolved:function(){
                   callback(onResolved)
                },
                onRejected:function(){
                    callbacck(onRejected)
                }
            })
        }
    })
}
// 添加catch方法 catch方法的封装与异常穿透
Promise.prototype.catch = function(onRejected){
    return this.then(undefined,onRejected)
}

http://www.niftyadmin.cn/n/4968902.html

相关文章

SDK 自动化测试方案

测试背景 SDK 具有上百个接口,测试场景、测试用例繁多,对于修改某个模块的代码或 SDK 上线前均需要投入大量资源(人力、时间)进行回归验证。目前 QA 资源有限,希望通过梳理 SDK 的功能,尝试使用自动化测试…

聊聊如何解析pom文件

序 本文主要研究一下如何解析pom文件 maven-model maven提供了maven-model的类库可以直接解析 <dependency><groupId>org.apache.maven</groupId><artifactId>maven-model</artifactId><version>3.9.4</version></dependency&…

算法岗和开发岗有什么区别?

算法岗和开发岗有什么区别&#xff1f; ​ 算法岗位和开发岗位在实际应用中有很大的差异&#xff0c;而且其工作的内容重心也不一样。企业对职位能力的要求也是存在着很大的区别。 ​ 其实在真正的实践中&#xff0c;只有大厂才对这两个岗位分的比较清楚&#xff0c;小的公司…

【Java】反射 之 调用方法

调用方法 我们已经能通过Class实例获取所有Field对象&#xff0c;同样的&#xff0c;可以通过Class实例获取所有Method信息。Class类提供了以下几个方法来获取Method&#xff1a; Method getMethod(name, Class...)&#xff1a;获取某个public的Method&#xff08;包括父类&a…

服务器基础

0x01基础 介绍 可以理解为企业级的电脑&#xff0c;比个人使用的电脑具备更强的配置、性能、可靠性及稳定性。设计工艺和器件全部采用企业级设计&#xff0c;保障7*24小时稳定运行。 演进历史 处理性能 外观 发展方向 分类 按外形分类 按高度分类 按应用分类 按综合能力…

什么是财务数字化?财务数字化怎么做?

如今&#xff0c;科技飞速发展&#xff0c;产业变革加剧&#xff0c;诸如大数据、人工智能、云计算和物联网等技术发展迅速&#xff0c;逐步改变人类生产生活的方方面面。一场影响世界的数字化变革正在悄然发生。2020年9月&#xff0c;国务院印发《关于加快推进国有企业数字化转…

统计学作业啊啊啊啊

题目1 一个制药公司宣称其新药可以将病患的恢复时间从10天降至8天。为了验证这一声明&#xff0c;您从服用新药的病患中抽取了一个样本&#xff0c;发现样本均值为9天&#xff0c;样本标准差为2天&#xff0c;样本量为30。使用0.05的显著性水平进行假设检验&#xff0c;判断公…

journal日志导致服务器磁盘满

背景 ubuntu 18.04服务器磁盘突然100% 一查/var/log/journal目录占了14G 清理 要清理 journal 日志&#xff0c;可以使用以下步骤&#xff1a; 运行以下命令来查看 journal 日志的使用情况&#xff1a; journalctl --disk-usage这将显示 journal 日志的当前使用情况&#x…