对ECMA规范中Promise then/catch处理程序入队微任务队列的逻辑疑惑
Promise then/catch处理程序入队微任务的规范解读
你的核心结论是对的:JavaScript中Promise的then、catch处理程序,确实会在Promise被resolve或reject后被放入微任务队列,你的理解偏差出在对NewPromiseReactionJob的作用认知上,拆解规范细节就能理清:
PerformPromiseThen的核心逻辑:当Promise状态为fulfilled时,步骤10.b调用NewPromiseReactionJob(fulfillReaction, value)的目的,是创建一个包含处理程序执行逻辑的作业对象,而非直接执行处理程序。随后步骤10.c调用HostEnqueuePromiseJob,是把这个刚创建的作业对象加入微任务队列——此时处理程序完全没有执行。NewPromiseReactionJob的真实作用:这个方法是用来生成一个「待执行的作业函数」,你看到的Completion(HostCallJobCallback(handler, undefined, « argument »))是这个作业函数内部的逻辑,只有当微任务调度器从队列中取出这个作业并执行时,才会走到这一步调用处理程序。- 关键区分:
NewPromiseReactionJob是「定义作业内容」,HostEnqueuePromiseJob是「把作业入队」,处理程序的执行则是「作业被调度时的动作」,三者是严格的先后顺序,不存在处理程序在入队前执行的情况。
内容的提问来源于stack exchange,提问作者a Learner
相关产品推荐
相关产品推荐

