事件循环( Event Loop ),微任务( promise) 与 宏任务( setTimeout ):
微任务( micro task ) :Javascript引擎发起的任务
宏任务( macro task ) :宿主(我们)发起的任务
异步任务的执行优先级并不相同,它们被分为两类:微任务( micro task ) 和 宏任务( macro task )
根据异步事件的类型,这些事件实际上会被派发对应的宏任务和微任务中,在当前主线程执行完毕后,会先查看微任务中是否有事件存在,如果不存在,则再去找宏任务;
如果存在,则会依次执行队列中的参数,直到微任务列表为空,然后去宏任务中一次读取事件到主线程中执行,如此反复;当前主线程执行完毕后,会首先处理微任务队列中的事件,然后再去读取宏任务队列的事件。在同一次事件循环中,微任务永远在宏任务之前执行。
宏任务( macro-task ):整体 script、setTimeout、setInterval、UI交互事件、I/O
微任务( micro-task ):process.nextTick、Promise、MutaionObserver(突变观察者)
(此处纯属个人理解:宏观任务保存在 “任务队列” 中,微观任务保存在 执行栈中,事件循环其实也就是不断执行宏观任务)
(function test() {
setTimeout(function() {console.log(4)}, 0);
new Promise(function (resolve, reject) {
console.log(1); // 微任务保存在执行栈中会立即执行
for( var i=0 ; i<10000 ; i++ ) {
i == 9999 && resolve();
}
console.log(2);
}).then(function() {
console.log(5);
});
console.log(3);
})()
// 1. setTimeout:宏任务:存入宏任务队列
// 2. Promise:函数本身是同步执行的( **Promise** 只有一个参数,默认new的时候就会同步执行),
// `.then` 是异步,因此依次打印1、2 `.then` 是微观任务Promise对象的回调函数,先于 setTimeout 执行
// 3. 打印3( 第一次主线程执行完毕 )
// 4. 执行微任务中的回调函数:5, 让后执行宏任务中的 `setTimeout` 4
// 最终结果1,2,3,5,4
原创文章,作者:wdmbts,如若转载,请注明出处:https://blog.ytso.com/277202.html