开发者问题收集

Promise 意外行为、执行顺序

2017-06-28
62

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

进一步解释: 我的代码在周日运行正常,我不知道 执行的异步性质 ,两天后才发现这一点!

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

console.log(4);

输出:

1

2

4

3


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

可能的答案: 因为承诺结果在主体返回后执行

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

2个回答

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

Kapol
2017-06-28

感谢@PatrickRoberts 提供参考:

Promises 天然是 ASYNC 的,并在下一次事件循环执行时执行。

aliep
2017-06-28