You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
一个浏览器环境(unit of related similar-origin browsing contexts.)只能有一个事件循环(Event loop),而一个事件循环可以多个任务队列(Task queue),每个任务都有一个任务源(Task source)。
相同任务源的任务,只能放到一个任务队列中。不同任务源的任务,可以放到不同任务队列中。
看看下面JS,执行后的结果是什么
答案是 1 2 3 5 4;
而不是 1 2 3 4 5;
原因:
有一个事件循环,但是任务队列可以有多个。
整个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先执行。
microtask(Job) > macrotask(Task);
microtask:
process.nextTick
>Promise
>Object.observe
>MutationObserver
macrotask:
setTimeout
>setInterval
>setImmediate
参考资料
Node.js的event loop及timer/setImmediate/nextTick
Process.nextTick 和 setImmediate 的区别
你不知道的setTimeout
The text was updated successfully, but these errors were encountered: