路虎哥哥

导航

事件循环( Event Loop ),微任务( promise) 与 宏任务( setTimeout ):

事件循环( 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
 

posted on 2022-07-26 22:49  路虎哥哥  阅读(473)  评论(0编辑  收藏  举报