2017-06-28 56 views
3

在将Chrome升级到58之前,我没有任何错误。Promise意外的行为,执行顺序

进一步说明:我的代码是工作在周日,我是不知道的执行的异步性质,发现了这两天后!

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

console.log(4); 

OUTPUT:


1-为什么'then'在console.log(2)之后被执行?

可能的答案:因为承诺结果被人体后,执行返回

2 - 为什么“然后”得到的console.log(4)后执行???

+3

承诺不应该是同步的。想象一下,解析器/拒绝器是'setTimeout(function(){...})',你会得到基本相同的行为。 –

+0

我对我所有的测试浏览器(firefox/chrome/edge/opera)都有相同的顺序。对于我不知道的第一个问题,但看起来像3是在4之后出现的逻辑,就像在常规的异步调用中一样,接下来的代码在回调之前执行。 – Kaddath

+0

@PatrickRoberts对,但我的代码在周日工作,我没有意识到执行中的异步本质,今天发现了这个有趣的事情! –

回答

1

由于承诺的异步性质,then处理程序将存储在事件循环的消息队列中。只要JavaScript运行时的调用堆栈为空,就会处理此队列的元素。在你的场景中,console.log(4);需要在封装函数从调用堆栈中取出之前运行,此时JavaScript引擎可以开始处理来自消息队列的项目(假设封闭函数是顶层函数),导致运行then中的代码。