We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
执行如下代码:
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 先执行。
作者:何幻 链接: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 和 任务队列等底层机制的原理。
文章仅供参考
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Promise的队列与setTimeout的队列的有何关联?(内容转自知乎)
本篇文章内容来自知乎上的一个问题
## 令人疑惑的问题
执行如下代码:
为何结果是:
而不是:
造成这种与直观感受相悖的结果的原因在哪里呢?
## 点赞最多的解答
这让我想起了当年朴大神在对一篇有关 Event Loop 文章的评注中所提到的:
希望还能有更多的好文为我们阐明 Event Loop 和 任务队列等底层机制的原理。
文章仅供参考
## THANKS
The text was updated successfully, but these errors were encountered: