大概意思是:浏览器中的任务队列不止一个,且优先级也不同。基本上可以分为如下两种:
macro-task: script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering
micro-task: process.nextTick, 原生Promise, Object.observe, MutationObserver
我们看到原生Promise和setTimeout分别属于micro-task和macro-task。我们之前说的异步任务队列,指的是macro-task。而micro-task的执行顺序,与之不同。
在执行完主线程上的所有任务时,会先去查看micro-task队列中有没有任务,如果有,则依次执行micro-task队列中的所有任务,之后才去查看macro-task队列。每次拿到macro-task队列上任务并执行之后,都会去检查micro-task队列,以此循环。
https://segmentfault.com/q/1010000008612124
我们都知道javascript
是单线程的,也就是说,一个时间只能做一件事。所以,所有的任务都要按照一定的顺序排队,然后一个一个执行。如果所有的任务都是同步的,那就没有什么问题,代码按照从前到后的顺序依次执行就可以了,但我们实际工作过程中,难免会有一些操作需要异步执行——比如事件,比如ajax,比如setTimeout
。
所以,浏览器会维护一个任务队列(task queue
),任务队列是先进先出的,也就是说,先进入任务队列的会先执行。当主线程任务执行完毕,就会查看任务队列中有没有新任务,如果有,则把第一个任务放到主线程中执行,以此循环往复,这个过程也就是Event loops
。
我之前也一直都以为浏览器中只有一个任务队列,看到这个问题后才知道。原来浏览器中的任务队列不止一个,且优先级也不同。基本上可以分为如下两种:
macro-task
: script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI renderingmicro-task
: process.nextTick, 原生Promise, Object.observe, MutationObserver
我们看到原生Promise
和setTimeout
分别属于micro-task
和macro-task
。我们之前说的异步任务队列,指的是macro-task
。而micro-task
的执行顺序,与之不同。
在执行完主线程上的所有任务时,会先去查看micro-task
队列中有没有任务,如果有,则依次执行micro-task
队列中的所有任务,之后才去查看macro-task
队列。每次拿到macro-task
队列上任务并执行之后,都会去检查micro-task
队列,以此循环。所以上面题目中结果是12354
就很明了了。
2017-05-20 21:24