setTimeout和Promise的任务队列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了setTimeout和Promise的任务队列相关的知识,希望对你有一定的参考价值。

栈,是指只有在一端进行存取的表结构。可以看做一个打开的箱子,永远只能对最上面的东西进行操作。也就是先进(栈底)后出(必须把上面的全都拿走),后进(栈顶)先出的顺序。

队列,是指排队过安检,先进先出。

在JS的单线程中,任务队列可以有多个。这些队列都是依靠函数调用栈来循环执行,这也就是我们常说的事件轮询。

任务队列包括宏任务(script全局,setTimeout,setInterval)和微任务(Promise)。

setTimeout和Promise作为任务分发器,将未来需要执行的任务分发到各自队列中。

Promise在每次事件循环的对尾。

从script(整体代码)开始第一次循环,全局上下文进入函数调用栈(栈底),如果有可执行代码就进行正常的入栈出栈,如果有上面提到的setTimeout和Promise,就将任务分发到各自队列,直到调用栈清空(只剩全局),然后执行所有的微任务队列(Promise队列),这就是第一次循环。当所有可执行的微任务执行完毕之后,循环再次从宏任务(setTimeout队列)开始执行入栈出栈任务分发等,执行完毕,然后再执行所有的微任务,第二次循环结束。。。这样一直循环下去,直到再也没有可执行的任务。这就是JS的循环机制。

等到浏览器关闭页面,在栈底的全局上下文才会出栈。

相关阅读:https://www.tuicool.com/articles/MnY7N3a

https://www.zhihu.com/question/36972010

 

以上是关于setTimeout和Promise的任务队列的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript的本来面貌之默认结构

promise 及 setTimeout 执行顺序

宏任务和微任务的执行顺序

JS事件循环机制(宏任务,微任务)

JS事件循环机制(宏任务,微任务)

js 宏任务和微任务