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
Promises 天然是 ASYNC 的,并在下一次事件循环执行时执行。
aliep
2017-06-28