宏任务与微任务


前言
JavaScript是个单线程语言,所以就是说在执行一行代码的过程中,必然不会存在同时执行的另一行代码的情况。
但如果大量的代码都是同步执行的话,程序将进入假死状态等待前面代码执行完毕,这显然不够友好。
所以为了这种应对这种情况,有了异步的概念, JavaScript的处理很像一个分配任务的管理者,单收到一个异步任务或者请求时候,JavaScript引擎将任务放入一个任务队列中,JavaScript只做一个标识,用来接收成果或者分配任务。

如网络请求就是一个天生的异步,此时程序告诉你的是,你可以去处理其他事情,而不是愣愣的等待。

 

一、宏任务与微任务的执行顺序
  这可以抽象起来理解,举个例子,一个很简单的柜台原理,银行柜员接待客户,接待一个客户就是一个宏任务,这个客户,有可能办理信用卡业务,
或者存款,取款,这些可以理解为微任务,当这个客户(宏任务)里面的所有业务(微任务)都办理完成后。才会进行下一个宏任务。

执行片段如下:

 

 当前宏任务->当前宏任务中的所有微任务->下一个宏任务 

二、宏任务与微任务有什么

宏任务:
setTimeout,setInterval,setImmediate

补充:其中node支持setImmediate,而在浏览器上不建议(或不支持)使用,在MDN文档(https://developer.mozilla.org/en-US/docs/Web/API/Window/setImmediate)中也有提到,非标准功能。

process.nextTick, MutationObserver, Promise

三、例子

如:

 1 new Promise((resolve, reject) => {
 2     setTimeout(()=> { // 宏任务
 3         console.log(1);
 4     })
 5     resolve(2);
 6 }).then(res => {
 7     console.log(res);
 8     return 3
 9 }).then(ress => {
10     console.log(ress)
11 })
12 
13 
14 // 输出
15 2
16 3
17 1

由于settimeout属于宏任务,插入宏任务队列中,等待当前所有微任务执行完,才会继续执行。故而输出 2->3->1

 

posted @ 2020-12-05 22:22  志在指尖  阅读(154)  评论(0编辑  收藏  举报