宏任务与微任务
前言
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
以梦为马