Javascript 承诺意外的行为、执行命令

Javascript 承诺意外的行为、执行命令,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,在将Chrome升级到58之前,我没有任何错误 进一步解释:我的代码在周日运行,我没有意识到执行的异步性,两天后发现了这一点 new Promise((s, f) => { console.log(1); s(); console.log(2); }) .then(r => {console.log(3)}) console.log(4); 输出: 一, 二, 四, 三, 1-为什么在console.log(2)之后执行“then” 可能的答案:因为pr

在将Chrome升级到58之前,我没有任何错误

进一步解释:我的代码在周日运行,我没有意识到执行的异步性,两天后发现了这一点

new Promise((s, f) => {
    console.log(1);
    s();
    console.log(2);
})
.then(r => {console.log(3)})

console.log(4);
输出:

一,

二,

四,

三,


1-为什么在console.log(2)之后执行“then”

可能的答案:因为promise结果在body返回后执行

2-为什么在console.log(4)之后执行“then”


承诺自然是异步的,并在下一个事件循环执行时执行。

由于承诺的异步性质,
然后
处理程序将存储在事件循环的消息队列中。每当JavaScript运行时的调用堆栈为空时,就会处理此队列的元素。在您的场景中,
console.log(4)需要先运行,然后才能将封闭函数从调用堆栈中取出,此时JavaScript引擎可以开始处理消息队列中的项目(假设封闭函数是顶级函数),从而在
中运行代码,然后

承诺不应是同步的。假设解析器/拒绝器是
setTimeout(function(){…})
,您将得到基本相同的行为。对于第一个问题,我不知道,但似乎逻辑上3在4之后,就像在常规异步调用中一样,下面的代码在回调之前执行。@PatrickRoberts是的,但我的代码在周日工作,我不知道执行中的异步性质,今天发现了这一点,很有趣!