promise的内部实现原理及常见问题

本文深入探讨了Promise在异步编程中的作用,包括其封装异步操作、解决回调地狱问题、状态不可变以及异常处理机制。Promise的then方法确保回调异步执行,遵循特定事件循环规则。链式调用中,每个then返回新的Promise以维持流程。同时, reject函数用于处理操作失败情况,catch则用于捕获异常。理解这些概念对于优化JavaScript中的异步代码至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

优点
1.Promise 是一种封装和组合未来值得易于复用机制,实现关注点分离、异步流程控制、异常冒泡、串行/并行控制等
2.Promise会做出正确延时或异步操作,会解决callback处理异步回调可能产生的调用过早,调用过晚、调用次数过多过少、吞掉可能出现的错误或异常问题等,只接受首次 resolve(…)或 reject(…) 决议,本身状态转变后不会再变,所有通过 then(…) 注册的回调总是依次异步调用,所有异常总会被捕获抛出

then 回调异步执行
1)Promise 实例化时传入的函数会立即执行,then(…) 中的回调需要异步延迟调用
2)回调函数异步调用时机:可以理解为onFulfilled 或 onRejected 只在执行环境堆栈仅包含平台代码时才可被调用
3)实践中要确保 onFulfilled 和 onRejected 方法异步执行,且应该在 then 方法被调用的那一轮事件循环之后的新执行栈中执行,这个事件队列可以采用宏任务 macro-task机制或微任务 micro-task机制来实现
4)在ES6中,Promise 必须以 Promise Job 形式加入 job queues,也就是微任务micro-task。

Promise 状态
1)Promise 的三种状态:等待态(Pending)、执行态(Fulfilled)和拒绝态(Rejected)。一旦Promise被resolve或reject,不能再迁移至其他任何状态(即状态 immutable)
2)fulfilled 使用 resolved 代替,onFulfilled 使用 onResolved 代替

链式调用的promise
1)为保证 then 函数链式调用,then 需要返回 promise 实例
2) Promise 状态一旦 resolved 或 rejected就不能再迁移
3)handleResolved 函数功能为根据当前 promise 状态,异步执行 onResolved 或 onRejected 回调函数,因在 resolve 或 reject 函数内部同样需要相关功能,提取为单独模块

reject 函数
1)Promise 内部私有方法 reject 相较于 resolve 逻辑简单很多
2)resolve函数的作用:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去
reject函数的作用:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去

reject 和 catch 的区别
1)promise.then(onFulfilled, onRejected)在onFulfilled中发生异常的话,在onRejected中是捕获不到这个异常的
2)promise.then(onFulfilled).catch(onRejected) .then中产生的异常能在.catch中捕获
3)建议使用第二种,因为能捕获之前的所有异常
4)第二种的.catch()也可以使用.then()表示,它们本质上是没有区别的,.catch === .then(null, onRejected)

Promise的事件循环
1)Promise在初始化时,传入的函数是同步执行的,然后注册 then 回调。注册完之后,继续往下执行同步代码,在这之前,then 中回调不会执行。同步代码块执行完毕后,才会在事件循环中检测是否有可用的 promise 回调,如果有,那么执行,如果没有,继续下一个事件循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值