其他分享
首页 > 其他分享> > 事件循环( Event Loop ),微任务( promise) 与 宏任务( setTimeout ):

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

标签:setTimeout,console,任务,task,promise,事件,执行,Event
来源: https://www.cnblogs.com/luhu123/p/16522994.html