Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Promise的队列与setTimeout的队列的有何关联?(内容转自知乎) #33

Open
YIXUNFE opened this issue Nov 16, 2015 · 0 comments

Comments

@YIXUNFE
Copy link
Owner

YIXUNFE commented Nov 16, 2015

Promise的队列与setTimeout的队列的有何关联?(内容转自知乎)

本篇文章内容来自知乎上的一个问题

## 令人疑惑的问题

执行如下代码:

setTimeout(function(){console.log(4)},0);
new Promise(function(resolve){
    console.log(1)
    for( var i=0 ; i<10000 ; i++ ){
        i==9999 && resolve()
    }
    console.log(2)
}).then(function(){
    console.log(5)
});
console.log(3);

为何结果是:

1,2,3,5,4

而不是:

1,2,3,4,5

造成这种与直观感受相悖的结果的原因在哪里呢?


## 点赞最多的解答

作者:何幻
链接:http://www.zhihu.com/question/36972010/answer/71338002
来源:知乎

原因:有一个事件循环,但是任务队列可以有多个。整个 script 代码,放在了 macrotask queue 中,setTimeout 也放入 macrotask queue。但是,promise.then 放到了另一个任务队列 microtask queue 中。这两个任务队列执行顺序如下,取 1 个 macrotask queue 中的 task,执行之。然后把所有 microtask queue 顺序执行完,再取 macrotask queue 中的下一个任务。代码开始执行时,所有这些代码在 macrotask
queue 中,取出来执行之。后面遇到了 setTimeout,又加入到 macrotask queue 中,然后,遇到了 promise.then,放入到了另一个队列 microtask queue。等整个 execution context
stack 执行完后,下一步该取的是 microtask queue 中的任务了。因此 promise.then 的回调比 setTimeout 先执行。



这让我想起了当年朴大神在对一篇有关 Event Loop 文章的评注中所提到的:

事实上,不是所有事件的都放置在一个队列里。

希望还能有更多的好文为我们阐明 Event Loop 和 任务队列等底层机制的原理。

文章仅供参考


## THANKS
@YIXUNFE YIXUNFE changed the title Promise的队列与setTimeout的队列的有何关联? Promise的队列与setTimeout的队列的有何关联?(内容转自知乎) Nov 16, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant