关于setTimeout、Promise、Async/Await 的区别

35 阅读2分钟

前置知识

js是一个单线程语言,为了解决可能的多线程任务,出现了对应的同步任务和异步任务。

同步任务:  在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。是由 js 执行栈/回调栈执行

异步任务:  不进入主线程、而进入任务队列的任务,当主线程中的任务运行完成了,才会从任务队列中取出异步任务,放入主线程中执行

在同步任务执行期间,如果有异步任务触发,它们会被放到任务队列中等待执行,而不会立即执行。等到同步任务执行完成,事件循环的下一个轮次开始时,异步任务才会被执行。这种异步执行的机制使得 JavaScript 能够处理非阻塞的 I/O 操作,提高了程序的性能和用户体验。

宏任务

宏任务(Macro Tasks)是在事件循环中执行的任务的一种类型。与微任务(Micro Tasks)不同,宏任务通常是一些较大的、耗时较长的任务,它们会被放置在事件循环的任务队列中,等待执行,由 JavaScript 主线程执行的任务

宏任务包括

  • script(代码块)

  • setTimeout / setInterval 定时器

  • setImmediate 定时器

  • 网络请求

  • 事件监听器

  • requestAnimationFrame


微任务

微任务是由JS引擎发起的 常见的包括

  • Promise.then( )/catch( )
  • Async/Await

执行优先级

微任务 优先 宏任务

在每一个事件循环之前,微任务队列总是被清空的(microtask queue)

每一个 event loop 都有一个 microtask queue 每个 event loop 会有一个或多个macrotask queue ( 也可以称为task queue ) 一个任务 task 可以放入 macrotask queue 也可以放入 microtask queue中 每一次event loop,会首先执行 microtask queue, 执行完成后,会提取 macrotask queue 的一个任务加入 microtask queue, 接着继续执行microtask queue,依次执行下去直至所有任务执行结束。