ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-07-26 23:03:31  阅读:159  来源: 互联网

标签:setTimeout console 任务 task promise 事件 执行 Event


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有