Javascript 为什么Promise.resolve()会被延迟?

Javascript 为什么Promise.resolve()会被延迟?,javascript,promise,Javascript,Promise,我不明白为什么要解析Promise delay。然后()参数调用 例如: var myPromise = Promise.resolve(); console.log(myPromise); myPromise.then(()=>console.log('a')); console.log('b'); 控制台返回: > Promise { <state>: "fulfilled", <value>: undefined } > "b" > "a"

我不明白为什么要解析Promise delay
。然后()
参数调用

例如:

var myPromise = Promise.resolve();
console.log(myPromise);
myPromise.then(()=>console.log('a'));
console.log('b');
控制台返回:

> Promise { <state>: "fulfilled", <value>: undefined }
> "b"
> "a"
>承诺{:“已履行”,未定义}
>“b”
>“a”

如果满足了
myPromise
,为什么
.then()
不调用imeditaly resolve函数?

因为根据规范,promises在当前执行线程展开并返回到“平台代码”后调用其解析处理程序。这保证了它们总是被异步调用

因此,当执行线程完成时,您首先会看到
console.log('b')
,然后在您看到
console.log('a')
的地方调用解析处理程序

从:

2.2.4在执行之前,不得调用OnCompleted或onRejected 上下文堆栈只包含平台代码。[3.1]

下面是注释[3.1]:

这里的“平台代码”是指引擎、环境和承诺 实现代码。在实践中,这一要求确保 onCompleted和onRejected在事件发生后异步执行 循环,然后在其中调用,并使用新堆栈。这可能是 使用“宏任务”机制(如setTimeout或 setImmediate,或使用“微任务”机制,如 MutationObserver或process.nextTick。自承诺实施以来 被认为是平台代码,它本身可能包含一个任务调度 调用处理程序的队列或“蹦床”


这样做是为了提供一致的执行顺序,因此无论何时解析承诺(同步或异步),相对于其他代码,
then()。由于许多承诺都是异步解析的,所以无论如何解析,使给定承诺保持一致的唯一方法就是让它们始终异步调用它们的
。然后()
处理程序。

承诺。解析
,它可能会异步解析,也可能不会

myPromise.then(function(){
     console.log("a");
});
console.log("b");
如果异步性保证不存在-有时会记录
ab
,有时则记录
ba
。这是一个比赛条件,也是一个挑战。承诺在设计上不易受到这个问题的影响,在新的承诺实现中,尤其是在本机承诺中,执行顺序总是得到保证的

运行新作业的实际实现是<代码>然后
将作业排队到处理程序中的作业队列,并在代码准备就绪后运行作业队列-这是指定的