我们在前文中已经介绍过 JavaScript 的主线程在碰到异步调用时,这些异步调用会急速返回某个值,大年夜而让主线程不会在此处壅塞。而真正的异步操作会由浏览器履行,主线程则会在清空当前调用栈后,按照祖先先出的次序攫取义务队列琅绫擎的义务。而 JavaScript 中的义务又分为 MacroTask 与 MicroTask 两种,在 ES2015 中 MacroTask 即指 Task,而 MicroTask 则是指代 Job。典范的 MacroTask 包含了 setTimeout, setInterval, setImmediate, requestAnimationFrame, I/O, UI rendering 等,MicroTask 包含了 process.nextTick, Promises, Object.observe, MutationObserver 等。 二者的关系可以图示如下:

参考 whatwg 规范 中的描述:一个事宜轮回(Event Loop)会有一个或多个义务队列(Task Queue,又称 Task Source),这里的 Task Queue 就是 MacroTask Queue,而 Event Loop 仅有一个 MicroTask Queue。每个 Task Queue 都包管本身按照回调入队的次序依次履行,所以浏览器可以大年夜内部到JS/DOM,包管动作按序产生。而在 Task 的履行之间则会清空已有的 MicroTask 队列,在 MacroTask 或者 MicroTask 中产生的 MicroTask 同样会被压入到 MicroTask 队列中并履行。参考如下代码:
- function foo() {
- console.log("Start of queue");
- bar();
- setTimeout(function() {
- console.log("Middle of queue");
- }, 0);
- Promise.resolve().then(function() {
- console.log("Promise resolved");
- Promise.resolve().then(function() {
- console.log("Promise resolved again");
- });
- });
- console.log("End of queue");
- }
- function bar() {
- setTimeout(function() {
- console.log("Start of next queue");
- }, 0);
- setTimeout(function
推荐阅读
51CTO诚邀您9月23号和秒拍/国美/美团元专家一路聊智能CDN的优化之路,抓紧时光哦! 互联网+时代,证券行业制订大年夜数据计谋急切而合时。一方面,近年来大年夜数据被晋升到国度成长计谋层>>>详细阅读
本文标题:JavaScript Event Loop机制详解与Vue.js中nextTick的实践应用
地址:http://www.17bianji.com/lsqh/37333.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示