手撕Promise代码

SAP LSMW数据批导操作手册及跨客户端传输方法(涉及默认值配置,及多余字段如何删除) SAP LSMW数据批导操作手册及跨客户端传输方法 阅读详情

我的思路是根据这个Promise的使用方法,一步步用js还原其原理

// 这个回调函数传进来就开始执行了
let oP = new Promise((resolve, reject) => {
    resolve(1)
})

// 这个要根据你的状态进行选择 Fulfilled pending Rejected
oP.then((res) => {
    console.log(res)
}, (rej)=> {
    console.log(rej)
})
// 源码实现
// Fulfilled pending Rejected
function MyPromise(executor) {
    let self = this
    this.status = 'pending'
    this.resolveValue = null
    this.rejectValue = null
    this.ResolveCallBackList = []
    this.RejectCallBackList = []

    function resolve(val) {
       if(self.status === 'pending') {
			self.status = 'Fulfilled'
        	self.resolveValue = val
       }
    }
    function reject(reason) {
       if(self.status === 'pending') {
			self.status = 'Rejected'
            self.rejectValue = reason      
       }
    }

    try {
        executor(resolve, reject)
    } catch(e) {
        reject(e)
    }
}

MyPromise.prototype.then = function(onFulfilled, onRejected) {
    let self = this
    if(this.status === 'Fulfilled') {
        onFulfilled(self.resolveValue)
    }
    if(this.status === 'Rejected') {
        onRejected(self.rejectValue)
    }
}

现在有了初步的实现,我们继续完善功能,如果是出现如下情况

let oP = new MyPromise((resolve, reject) => {
	// resolve函数放在了异步事件中,那么此时then函数会先于resolve执行
	// then函数无法拿到resolve函数所传的值
	setTimeout(() => {
	      resolve(1)
	  });
})

解决方法:构造函数定义一个回调列表,分别对应
Fulfilled Rejected 这个状态

// Fulfilled pending Rejected
function MyPromise(executor) {
    let self = this
    this.status = 'pending'
    this.resolveValue = null
    this.rejectValue = null
    this.ResolveCallBackList = []
    this.RejectCallBackList = []

    function resolve(val) {
        if (self.status === 'pending') {
            self.status = 'Fulfilled'
            self.resolveValue = val
            self.ResolveCallBackList.forEach(item => {
                item()
            })
        }
    }
    function reject(reason) {
        if (self.status === 'pending') {
            self.status = 'Rejected'
            self.rejectValue = reason
            self.RejectCallBackList.forEach(item => {
                item()
            })
        }
    }

    try {
        executor(resolve, reject)
    } catch (e) {
        reject(e)
    }
}

MyPromise.prototype.then = function (onFulfilled, onRejected) {
    let self = this
    if (this.status === 'Fulfilled') {
        onFulfilled(self.resolveValue)
    }
    if (this.status === 'Rejected') {
        onRejected(self.rejectValue)
    }
    if (this.status === 'pending') {
        self.ResolveCallBackList.push(function () {
            onFulfilled(self.resolveValue)
        })
        self.RejectCallBackList.push(function () {
            onRejected(self.rejectValue)
        })
    }
}

继续添加功能:

功能1:由于then函数是一个微任务事件,这里我们使用setTimeout进行模拟
功能2:实现then函数的一个链式调用
功能3:then函数中出异常,利用try、catch进行处理
功能四:如果是then函数传入的参数出现空值,那么需要对参数进行非空判断并且进行重写

// Fulfilled pending Rejected
function MyPromise(executor) {
    let self = this
    this.status = 'pending'
    this.resolveValue = null
    this.rejectValue = null
    this.ResolveCallBackList = []
    this.RejectCallBackList = []

    function resolve(val) {
        if (self.status === 'pending') {
            self.status = 'Fulfilled'
            self.resolveValue = val
            self.ResolveCallBackList.forEach(item => {
                item()
            })
        }
    }
    function reject(reason) {
        if (self.status === 'pending') {
            self.status = 'Rejected'
            self.rejectValue = reason
            self.RejectCallBackList.forEach(item => {
                item()
            })
        }
    }

    try {
        executor(resolve, reject)
    } catch (e) {
        reject(e)
    }
}

MyPromise.prototype.then = function (onFulfilled, onRejected) {
    if(!onFulfilled) {
        onFulfilled = function(val) {
            return val
        }
    }
    if(!onRejected) {
        onRejected = function(reason) {
            return reason
        }
    }
    let self = this
    let nextPromise = new MyPromise(function (res, rej) {
        if (self.status === 'Fulfilled') {
            setTimeout(() => {
                try {
                    let returnValue = onFulfilled(self.resolveValue)
                    res(returnValue)
                } catch (e) {
                    rej(e)
                }
            })
        }
        if (self.status === 'Rejected') {
            setTimeout(() => {
                try {
                    let returnValue = onRejected(self.rejectValue)
                    rej(returnValue)
                } catch (e) {
                    rej(e)
                }
            })
        }
        if (self.status === 'pending') {
            self.ResolveCallBackList.push(function () {
                setTimeout(() => {
                    try {
                        let returnValue = onFulfilled(self.resolveValue)
                        res(returnValue)
                    } catch (e) {
                        rej(e)
                    }
                })                
            })
           
            self.RejectCallBackList.push(function () {
                setTimeout(() => {
                    try {
                        let returnValue = onRejected(self.rejectValue)
                        rej(returnValue)
                    } catch (e) {
                        rej(e)
                    }
                })                
            })
        }
    })
    return nextPromise
}

最后一个功能:then函数中的参数(参数是个函数)返回的是一个MyPromise对象,我们应该如何处理。案例如下:

let oP = new Promise((resolve, reject) => {
  	resolve(1)
 })
 // 这里有两个promise之间的关系问题,实际上也是我们需要解决的问题
 oP.then((res) => {
     console.log(res)
     return new Promise((res, rej) => {
         res(1) // 这个返回来的Promise对象最后赋值给then函数的内部变量
     })
 }).then(res => {
     console.log('then: ', res)
 }) 

解决方法:

// Fulfilled pending Rejected
function MyPromise(executor) {
    let self = this
    this.status = 'pending'
    this.resolveValue = null
    this.rejectValue = null
    this.ResolveCallBackList = []
    this.RejectCallBackList = []

    function resolve(val) {
        if (self.status === 'pending') {
            self.status = 'Fulfilled'
            self.resolveValue = val
            self.ResolveCallBackList.forEach(item => {
                item()
            })
        }
    }
    function reject(reason) {
        if (self.status === 'pending') {
            self.status = 'Rejected'
            self.rejectValue = reason
            self.RejectCallBackList.forEach(item => {
                item()
            })
        }
    }

    try {
        executor(resolve, reject)
    } catch (e) {
        reject(e)
    }
}

function ResolutionReturnPromise(returnValue, res, rej) {
    if(returnValue instanceof MyPromise) {
        returnValue.then((val) => {
            res(val)
        }, (reason) => {
            rej(reason)
        })
    } else {
        res(returnValue)
    }
}

MyPromise.prototype.then = function (onFulfilled, onRejected) {
    if(!onFulfilled) {
        onFulfilled = function(val) {
            return val
        }
    }
    if(!onRejected) {
        onRejected = function(reason) {
            return reason
        }
    }
    let self = this
    let nextPromise = new MyPromise(function (res, rej) {
        if (self.status === 'Fulfilled') {
            setTimeout(() => {
                try {
                    let returnValue = onFulfilled(self.resolveValue)
                
                    ResolutionReturnPromise(returnValue, res, rej)
                } catch (e) {
                    rej(e)
                }
            })
        }
        if (self.status === 'Rejected') {
            setTimeout(() => {
                try {
                    let returnValue = onRejected(self.rejectValue)
                    ResolutionReturnPromise(returnValue, res, rej)
                } catch (e) {
                    rej(e)
                }
            })
        }
        if (self.status === 'pending') {
            self.ResolveCallBackList.push(function () {
                setTimeout(() => {
                    try {
                        let returnValue = onFulfilled(self.resolveValue)
                        ResolutionReturnPromise(returnValue, res, rej)
                    } catch (e) {
                        rej(e)
                    }
                })                
            })
           
            self.RejectCallBackList.push(function () {
                setTimeout(() => {
                    try {
                        let returnValue = onRejected(self.rejectValue)
                        ResolutionReturnPromise(returnValue, res, rej)
                    } catch (e) {
                        rej(e)
                    }
                })                
            })
        }
    })
    return nextPromise
}

这里是个初稿,太困了,后续再附上详细说明和修正

ISP之LSC(Lens Shading Correction) LSC - Lens Shading Correction即镜头暗影校正。 阅读详情

相关推荐

日语五十音图速记攻略:从形象联想法到实战训练

语言学习中的记忆编码与条件反射构建是高效掌握基础的关键。其核心原理在于通过将抽象符号与具象图像、故事或已知概念关联,利用大脑对视觉和叙事信息的天然高记忆效率,从而降低认知负荷,加速识别与反应速度。这一方法的技术价值在于将机械重复转化为意义联结,显著提升长期记忆的牢固度与提取速度。在日语学习这一具体应用场景中,五十音图作为表音文字系统,正是实践这一记忆技术的绝佳对象。通过系统化的形象联想、分组对比(如平假名与片假名的对应关系)以及间隔重复的实战训练,学习者可以高效攻克这一入门难关,为后续的词汇、语法学习铺设坚

weixin_29032489的博客 378

【js进阶】手撕Promise,一码一解析 包懂!

奥术大

goodloving的博客 2364

RT-Thread与LWIP协议栈在GD32F450XX上的移植实战:从FreeRTOS到RT-Thread的切换指南

本文详细介绍了将LWIP协议栈从FreeRTOS移植到RT-Thread系统,并在GD32F450XX开发板上实现的完整实战指南。重点解析了sys_arch适配层、邮箱与信号量接口的关键改造,以及网络驱动ethernetif.c的适配步骤,帮助开发者解决线程通信差异,实现稳定网络连接。

linux6sysadmin的博客 825

【JavaScript】其实真不难,带你一步一步手撕promise。

带你手写promise

qq_53715003的博客 1469

手把手教你用EGM96模型校正DEM数据(含在线工具推荐)

本文详细介绍了如何使用EGM96地球重力场模型校正DEM数据中的高程偏差。通过对比WGS84椭球面与大地水准面的差异,解释了校正原理,并提供了从在线工具快速验证到Python脚本批量处理的全流程实战指南,帮助GIS开发者和数据分析师确保高程数据基准一致,提升空间分析精度。

ttt77的博客 1008

基因树构建全流程:从OrthoFinder到iTOL的保姆级教程(附兰科植物案例)

本文提供了一份从OrthoFinder到iTOL的基因树构建全流程保姆级教程。详细解析了利用OrthoFinder构建物种树、IQ-TREE构建无根基因树、Notung进行树调和生根,以及最终在iTOL中实现专业可视化的每一步操作与实战经验,并以兰科植物NB-ARC基因家族为例进行演示,帮助研究者系统掌握基因树分析方法。

tequila的博客 524

Promise超详细(含手撕)

如果回调函数返回的不是promise,则then返回的promise的状态为成功,值是回调函数返回的值(没有就是undefined)。只要有一个失败返回的就是一个失败的promise对象,属性值为失败的那个promise的属性值。的结果状态就是最终的结果状态,race赛跑的意识,相当于数组里的promise进行赛跑,谁的状态先改变,race函数的返回结果状态和属性值就看它。传入一个数组,若p1、p2、p3都是一个成功的promise对象则函数返回一个新的成功的promise对象,且属性值为。

internet__的博客 1173

老N卡福音:GT1030/GTX1050在MacOS Ventura 13.2上的完整驱动指南(附实测截图)

本文详细介绍了如何在MacOS Ventura 13.2上通过OCLP工具链驱动GT1030和GTX1050等老款NVIDIA显卡,涵盖硬件兼容性验证、BIOS设置、OpenCore配置、驱动安装及性能测试全流程。实测数据显示,这些基于Pascal和Maxwell架构的显卡在当代MacOS系统中仍能发挥实用价值,为老N卡用户提供完整解决方案。

weixin_30832143的博客 633

Promise ? 我 promise 你一个详细的手撕过程

Promise的手写过程不是很难,大家自己动手理清思路和重要,下面是我手写Promise的源码,就实现了一些常用Promise的方法,所有的测试都能跑通,XDM放心食用,更详细的讲解放在最后了!

Mr_wyt的博客 546

【无标题】EXCEL实现刷题

运用Excel开发的刷题工具,具有普遍实用性,可将WORD的试题自动导入并实现刷题。

weixin_44081794的博客 2974

【Claude】API Error 通用错误:错误码含义与标准排查流程 bug报错已解决

Claude API 各类错误码速查与标准排查流程。

博客 8246

自己封装一个Promise详解,手撕Promise

Promise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一,本文详细介绍了如何手写一个Promise,即手撕Promise,主要封装了Promise的then、catch、resolve、reject、all、race方法

XuZhiqiang的博客 951

基于51单片机的智能台灯设计:嵌入式程序设计实现

随着智能家居和物联网的快速发展,智能台灯作为一种典型的智能家居产品,已成为现代家庭中不可或缺的设备。传统的台灯只能提供简单的照明功能,而智能台灯不仅具备基础的照明功能,还能根据用户的需求进行自动调节,比如自动调节亮度、色温,甚至具备定时开关、远程控制等智能功能。本文将介绍如何基于51单片机设计一款智能台灯。我们将涉及硬件设计、嵌入式系统架构、传感器选择、调光控制、语音识别、远程控制等方面,详细阐述如何实现这些功能,并给出相关的代码和实现步骤。

2201_76125393的博客 837

【JavaScript】详解Promise(含手撕代码)

Promise 是现代 JavaScript 异步编程的基础机制,面试常考手写 Promise 实现,包括状态管理、then 方法等核心功能。

XPRNB的博客 671

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

手撕代码之手写Promise

<!DOCTYPE html> <html> <head> <title>手写Promise</title> </head> <body> </body> <script type="text/javascript"> class MyPromise{ constructor(executor){ this.status = "pending";//当前状态 this.res =

weixin_39342847的博客 332

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

手撕Promise原理~~每行代码都有注释

手撕Promise,详解到每一行都有注释,轻松入门Promise原理

localhost 462

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

手撕代码彻底理解Promise

手写Promise实现原理,理解其基本使用和使用场景。

到得还来别无事,庐山烟雨浙江潮。 1098

手撕代码之Promise的实现(附源码)

ES6已经普及很多年了,我们早已过去了callback时代。公司要求也不再是停留在promise的使用上了。所以本文带大家一起从零开始写自己的 Promise,剖析其内在原理。 1、promise 基本结构 1.1 状态 我们都知道promise 有三种状态 Pending Resolved Rejected 并且promise 的状态是不可逆的 1.2 参数 每一个 Promise 都有两个 函数参数,分别是 resolved 成功状态 rejected 失败状态 1.3 方法 通过查看 P.

qq_43238599的博客 630

promise.all()方法手撕代码

Promise.all0 = function(promises){ return new Promise((reslove, reject)=>{ const len = promises.length; let arry_put = new Array(len); j = 0; for(var i = 0; i<len; i++){ Promise.resolve(promises[i]).then(res=>{ arry_put[j] = res; j++; if(j == len)

lkrdmm的博客 511

Promise高频场景题+手撕代码

本文整理了拼多多、小红书、牛客网前端面试中的 Promise 高频考点,包含并发控制、重试机制等核心场景题。主要内容包括: 并发控制:实现 promisePool 函数,限制最大并发数,适配电商批量查询场景,保证结果顺序与输入一致。 重试机制:手写 Promise.retry 方法,支持失败后自动重试,适用于支付接口等需要容错的业务场景。 核心 API 实现: 手写 Promise.all,要求与原生行为一致 手写 Promise.race,返回第一个完成的 Promise 结果 所有代码均提供详细注释和测

警警的博客 703

前端手撕代码——手撕promise其他方法

【代码】前端手撕代码——手撕promise其他方法。

Zhouyunfeier的博客 151

js手撕代码1: Promise和Promise.all()

【摘要】本文系统介绍了ES6 Promise的核心概念与应用:1) Promise作为异步编程解决方案,具有pending、fulfilled、rejected三种状态;2) 详细解析实例方法(then/catch/finally)和静态方法(all/race);3) 重点剖析Promise.all的实现原理,通过可迭代对象处理、异步结果收集等机制实现多任务并行处理;4) 提供三个随机数生成的Promise应用示例,演示Promise.all的实际使用场景。

2501_91987533的博客 358

前端手撕代码——手撕promise

【代码】前端手撕代码——手撕promise。

Zhouyunfeier的博客 276

ES6-Promise 65行代码手撕Promise

手撕Promise 到了找实习的时候,看面经感觉不是很好,还是写写代码最能记住东西 手撕目标 包含then、catch方法 支持链式调用 异步解决方案 手撕开始 那么首先,如果你不知道Promise,你可能需要绕道先去学习一下,因为这里不想啰嗦要直接动手写滴哦 我这里应该是和网上的很多教程不太一样哈,因为一时没有想到大家的思路… 基本框架 const PENDING = "pending"; const FINISHED = "fulfilled"; const FAILED = "rejected

MyWay 247

有关promise手撕代码(手写题)

【代码】有关promise手撕代码(手写题)

laowang357的博客 311

【手撕代码系列】JS手写实现Promise

在 JavaScript 中,Promise 是一种用于处理异步操作的对象,它可以让异步代码更易于理解和管理。在本文中,我们将手写实现一个 Promise。

CreatorRay的博客 588
上一篇: css三大常规布局
下一篇: 手动模拟实现Map
ccxCode
博客等级 码龄8年 1粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值