什么是单线程?异步任务的2种分类中,各自有哪些API?

js 是单线程执行,虽然增加了一个 worker 创造了多线程环境,但 worker 受限很多,本质上还是一个单线程。 js 执行是有一个执行栈,主要分了同步任务和异步任务,异步任务又分宏任务(ro-task)和 微任务(micro-task)。

宏任务有:

  1. setTimeout
  2. I/O
  3. setInterval
  4. setImmediate
  5. 主线程
  6. MessageChannel

微任务有:

  1. Promise 系列 .then .catch .finally
  2. process.nexttick
  3. MutationObserver

看下面这个案例,console.log从上到下,1到8排列。那么打印的结果是什么呢?

 

只要记住了上述罗列的宏任务和微任务,就可以轻松解答了。说到底就是一道记忆题。

第一:从上到下执行,三个同步任务,打印1,6,8.

 

第二:处理异步任务,先找微任务,打印 7.

 

第三:处理宏任务(同一层,图中绿线),先执行时间少的。打印内部的 同步任务3,异步微任务4. 此时又有一个宏任务setTimeout,可是时间比外层宏任务setTimeout 还要长。

 

第四:先执行外层2秒的宏任务,打印2,再执行内层3秒宏任务,打印5.

 

外层绿框是第一次比较的宏任务,先执行①;红框内层外层第二次比较的宏任务,先执行②;最后执行③。

实际上并没有内层外层的说法,下方绿框执行完毕之后就剩下③,然后③和②比较时间长短,决定谁先执行。③也不是等上3000毫秒,即3秒,而是

 

一秒后打印3,4再一秒后打印2再一秒后打印5.

胜象大百科