type
status
date
slug
summary
tags
category
icon
password

同步和异步

JS 中所有任务可以分为 2 种,一种是同步任务(synchronous),一种是异步任务(asynchronous)
同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。是由 js 执行栈/回调栈执行
异步任务:不进入主线程、而进入任务队列的任务,当主线程中的任务运行完成了,才会从任务队列中取出异步任务,放入主线程中执行
而异步任务,又可以分为宏任务微任务

宏任务

宏任务是由宿主环境发起的,比如浏览器、Node等,宏任务的异步代码有:
  • script(整体代码块)
  • setTimeout / setInterval 定时器
  • setImmediate 定时器
  • UI交互事件
  • postMessage
  • ......等等

微任务

微任务是由JS引擎发起的,微任务的异步代码有:
  • process.nextTick (Node.js环境)
  • Promise.then()/catch()/finally() 。注意,Promise本身同步,只是它里面的then/catch的回调函数是异步的微任务
  • Async/Await
  • Object.observe
  • ......等等

任务的执行顺序

有人说宏任务先于微任务执行,也有人说微任务先于宏任务执行
其实,由于整个 script 身就是一个大的宏任务,所以在执行任务时,肯定是执行script这个大的宏任务里面的代码,因此,我们也可以说是宏任务优先于微任务
但是如果我们忽略script这个大的宏任务,仅仅只讨论script里包含的任务代码块,那么任务的执行顺序就一定是微任务优先于宏任务
在这里,我们就先忽略script执行顺序就为:同步任务 ---> 微任务 ---> 宏任务
 
案例演示:下面代码的执行结果是什么?
我们可以通过文章开头的理论解释,将上面代码分为同步任务、微任务、宏任务三块,
哪些代码属于同步任务,哪些代码属于微任务,哪些代码属于宏任务,如下图所示:
notion image
将我们分析好的代码,分开放在相应的队列里,可得到以下代码执行的流程图示:
notion image
notion image
notion image
所以这个案例,最终得到的执行结果就是:1 3 4 5 “success” 2

小试牛刀

请说一说以下代码的执行顺序和结果:
解答:
结果:"X" 0 5 6 "C" 1 2 3 4
具体解答过程请看刷题小册第10题
 
Vue Router@4:安装和使用《新兴村》闲记
衔蝉
衔蝉
一个普通的干饭人🍚
公告
type
status
date
slug
summary
tags
category
icon
password
欢迎来到衔蝉的博客小站✨
这里是我的个人学习、生活记录
--- 免责声明 ---
⚠️ 本站内容仅代表个人观点
⚠️ 本站内容仅供学习参考使用
--- 关于我 ---
我要如加菲猫一般地活着
一大碗杂碎面
就能换来一个艳阳天🌻