JavaScript系列—宏任务和微任务 2021-12-13 21:47 184阅读 0赞 看这篇博文之前,先看一下下面的文章吧 《JavaScript 运行机制详解:再谈Event Loop》 [http://www.ruanyifeng.com/blog/2014/10/event-loop.html][http_www.ruanyifeng.com_blog_2014_10_event-loop.html] 本文有参考,微信搜索《重学前端 --- Promise里的代码为什么比setTimeout先执行?》 关于宏任务和微任务 先看几道题吧 var r = new Promise(function(resolve, reject){ console.log("a"); resolve() }); setTimeout(()=>console.log("d"), 0) r.then(() => console.log("c")); console.log("b") 打印a b c d 再回头来看看开头的一段代码,会不会豁然开朗了呢。JS 引擎首先会把Promise对象 和 console.log("b") 两个微观任务存入执行栈,把 setTimeout(宏观任务)存入 “任务队列” 所以在输出 a 和 b 以后并不会按照预期那样立即从 “任务队列” 中读取 setTimeout,因为 then方法是微观任务Promise对象的回调函数,先于 setTimeout 执行 Promise.resolve().then(()=>{ console.log('1') setTimeout(()=>{ console.log('2') },0) }) setTimeout(()=>{ console.log('3') Promise.resolve().then(()=>{ console.log('4') }) },0) 打印1 3 4 2 在交流群中看到有的小伙伴还是不太清楚正确的执行顺序,基于前面的介绍,大致的分析过程及草图如下: 1(红色):JS 引擎会把微观任务Promise存入执行栈,把宏观任务setTimeout存入 “任务队列” 2(绿色):主线程率先运行执行栈中的代码,依次输入1,然后把绿框的setTimeout存入 “任务队列” 3(蓝色):执行栈清空以后,会率先读取 “任务队列” 中最早存入的setTimeout(红框的那个),并把这个定时器存入栈中,开始执行。这个定时器中的代码都是微观任务,所以可以一次性执行,依次输出3 和 4 4(紫色):重复第3步的操作,读取 “任务队列” 中最后存入的setTimeout(绿框的那个),输出2 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYW9qc3Vu_size_16_color_FFFFFF_t_70][] 所以最终的输出结果就是 1 3 4 2 Promise.resolve().then(()=>{ console.log('1') setTimeout(()=>{ console.log('2') },0) }) setTimeout(()=>{ console.log('3') Promise.resolve().then(()=>{ console.log('4') }) }, 3000) 打印1 2 3 4 setTimeout(function(){console.log(4)},0); new Promise(function(resolve){ console.log(1) for( var i=0 ; i<10000 ; i++ ){ i==9999 && resolve() } console.log(2) }).then(function(){ console.log(5) }); console.log(3); 另外一个会让人感到迷惑的地方就是 resolve回调函数内部的那几行代码,输出1以后接着跑1000次循环才调用resolve方法,其实resolve()的意思是把 Promise对象实例的状态从pending变成 fulfilled(即成功) 成功的回调就是对应的then方法。所以resolve() 后面的 console.log(2) 会先执行,因为 resolve() 回调函数是在本轮事件循环的末尾执行 (关于这部分内容,可以参考 Promise对象 一文) 打印1 2 3 5 4 setTimeout(function(){console.log(4)},0); new Promise(function(resolve){ 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 2 3 4 [http_www.ruanyifeng.com_blog_2014_10_event-loop.html]: http://www.ruanyifeng.com/blog/2014/10/event-loop.html [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYW9qc3Vu_size_16_color_FFFFFF_t_70]: /images/20211213/c352f7ffe79d48a6a1123b5444a98fbc.png 文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。
相关 微任务,宏任务和Event-Loop 一段代码让你了解Event-Loop console.log(1); setTimeout(() => { console.log(2); 忘是亡心i/ 2021年09月18日 06:32/ 0 赞/ 165 阅读
相关 弄懂 JavaScript 执行机制,宏任务和微任务 转载自:[https://juejin.im/post/59e85eebf265da430d571f89][https_juejin.im_post_59e85eebf265d £神魔★判官ぃ/ 2021年09月18日 18:04/ 0 赞/ 203 阅读
相关 JavaScript系列—宏任务和微任务 看这篇博文之前,先看一下下面的文章吧 《JavaScript 运行机制详解:再谈Event Loop》 [http://www.ruanyifeng.com/blog/20 ╰+攻爆jí腚メ/ 2021年12月13日 21:47/ 0 赞/ 185 阅读
相关 宏任务和微任务的详解 微任务可以在实时性和效率之间做一个有效的权衡。 从目前的情况来看,微任务已经被广泛地应用,基于微任务的技术有 MutationObserver、Promise 以及以 Pro 怼烎@/ 2022年10月06日 08:51/ 0 赞/ 40 阅读
相关 js事件循环:微任务和宏任务 事件循环:微任务和宏任务 浏览器中 JavaScript 的执行流程和 Node.js 中的流程都是基于 事件循环 的。 理解事件循环的工作方式对于代码优化很重要,有时 墨蓝/ 2022年10月18日 12:54/ 0 赞/ 43 阅读
相关 前端宏任务和微任务详解 ![5f83bcf7946f1524e5b6581c2b5dad10.png][] 宏任务(macro-task) 定义 消息队列中的任务称为宏任务。 产生 ゞ 浴缸里的玫瑰/ 2022年10月27日 09:55/ 0 赞/ 62 阅读
相关 宏任务和微任务讲解 一、概念 1.宏任务MacroTask: 消息队列(回调队列)中的任务称为宏任务,是由宿主环境(浏览器或者node)提供的,不断的从消息队列中取出并被事件循环执行, 你的名字/ 2022年11月18日 09:55/ 0 赞/ 53 阅读
相关 php 宏任务和微任务_PHP宏带来乐趣和利润! php 宏任务和微任务 I was originally going to call this “Micro Macros with Márcio’s Perfectly P 拼搏现实的明天。/ 2022年12月03日 17:26/ 0 赞/ 27 阅读
相关 Javascript 宏任务,微任务 微任务:promise,process.nextTick 宏任务:setTimeout,setInterval,I/O,script 同一次事件循环中,微任务永远在宏任 客官°小女子只卖身不卖艺/ 2022年12月22日 14:25/ 0 赞/ 36 阅读
相关 JavaScript:宏任务 与 微任务 执行优先级 宏任务macrotask有哪些 script setTimeout setInterval MessageChannel postMessage setImmediate 叁歲伎倆/ 2023年01月22日 18:57/ 0 赞/ 28 阅读
还没有评论,来说两句吧...