热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于javascript的eventloop如何理解eventqueue的优先级?

最近看了javascript的eventloop相关资料,对eventqueue队列优先级没有理解到位还请各位大神帮我指点一二。第一篇是阮一峰老师的JavaScript运行机制详解:

最近看了Javascript的eventloop相关资料,对event queue队列优先级没有理解到位还请各位大神帮我指点一二。
第一篇是阮一峰老师的Javascript 运行机制详解:再谈Event Loop;这里面有讲到eventloop循环机制,其中有一个event queue队列,里面存放着异步任务的callback;在执行栈执行完成时就会从队列中读取队列任务并执行。这里并没有涉及到优先级,只介绍了event queue是FIFO数据结构。
然后看了第二篇波同学的前端基础进阶(十二):深入核心,详解事件循环机制
波同学在里面讲到了队列分为宏任务和微任务,而且微任务会在执行栈执行完后立即执行,而宏任务要等到下一次的event loop才会被执行;



这里有一个疑问就是eventloop循环机制中到底是只有一个queue队列还是有宏队列和微队列?因为他们俩讲的不同

不管是微任务队列还是宏任务队列都是遵循FIFO,那队列中的任务被读取到执行栈时也应该是按照这个顺序来执行,那该如何理解队列中任务的优先级?比如dom事件操作,ajax请求的回调、以及setTimeout他们之间是否有优先级?



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
console.log('start');

var xhr = new XMLHttpRequest();

var url = 'test.json';

xhr.open('GET', url,true);

xhr.Onreadystatechange= function() {

    if (xhr.status == 200 && xhr.readyState == 4) {

        console.log(xhr.responseText)

    }

}

xhr.send();

setTimeout(function() {

    console.log('timeout')

}, 0)

for (var i = 0; i <3000000000; i++) {}



var btn = document.querySelector("#btn");

btn.Onclick= function() {

    console.log('click')

}



new Promise((reslove, reject) => {

    console.log('promise');

    reslove();

}).then((res) => {

    console.log('promise finish')

})

console.log('end');

输出结果:

1
2
3
4
5
6
7
8
9
start

 promise

 end

 promise finish

 click

 {

    "test":"aa"

 }

 timeout

这里和我预期的有点不一样,我以为应该是ajax的回调先被执行到的,因为我故意停留了2-3秒来点击那个按钮,按理说ajax率先返回了应该被先加入到队列中,结果是click先先输出。。。这里是不是有优先级的存在?

------------------------------------------这是分割线2017-04-07更新---------------------------

经过一番折腾后,查看了很多大佬在这方面的博客文章在这里大概总结一些event loop的认识:

  1. 首先要明白的是event loop是由Javascript宿主环境(像浏览器)来实现的,js引擎他不关心也不知道event
    loop机制的运行和存在,他只负责从事件队列里面读取事件来执行,他不会也不会知道怎样向事件队列中push事件任务,这些都由宿主来完成。理解这第一点很重要要先知道是谁在做这件事情。


  2. 第二点就是一个宿主环境 只能有一个事件循环(Event loop),而一个事件循环可以多个任务队列(Task queue),每个任务都有一个任务源(Task source)。相同任务源的任务,只能放到一个任务队列中。不同任务源的任务,可以放到不同任务队列中。然后js引擎做的事就是不断的去读取这些队列里面的任务来执行,


  3. 任务可分为宏任务和微任务;他们的执行过程和顺序上面给的链接的波同学已经讲的很清楚明朗了。我再大概复述一遍:js引擎逐句的执行script整体代码,当遇到异步任务时,js的运行环境就会在适时的时候将这些事件任务push到相应的队列中去,等待着被js引擎去执行,而如果异步没有产生回调(callback)或者说是事件任务,那他就不会push到队列里面去,当js执行栈执行完成后,然后他把微任务队列中的任务读取过,并进行执行,在这执行过程中如果有产生新的异步任务也会按照上述的方式进行处理,当微任务执行完成后他会去读取宏任务队列中的任务并执行,然后周而复始的反复执行,直到把队列中的任务全部执行完。
    macro-task(宏任务): script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering;micro-task(微任务): process.nextTick, Promises(这里指浏览器实现的原生 Promise),Object.observe, MutationObserver


  4. 至于队列中的优先级,有一个大概的顺序process.nextTick > promise.then > setTimeout > setImmediate;优先级执行顺序可能还会和具体的宿主环境有关;边城大神也说的对对于异步我们更不应该去依赖他们的执行顺序既然是异步就当作无序的来处理。


参考资料:
1.Promise的队列与setTimeout的队列有何关联?
2.www.w3.org
3.http://stackoverflow.com/ques...
4.https://github.com/youngwind/...


   



推荐阅读
  • AJAX技术允许网页在不重新加载整个页面的情况下进行异步更新,通过向服务器发送请求并接收JSON格式的数据,实现局部内容的动态刷新。 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 当unique验证运到图片上传时
    2019独角兽企业重金招聘Python工程师标准model:public$imageFile;publicfunctionrules(){return[[[na ... [详细]
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
  • 本文探讨了如何在JavaScript中动态地引用由PHP生成的变量,特别是在循环中变量名随迭代变化的情况。通过示例代码展示了实现这一功能的具体步骤。 ... [详细]
  • 本文介绍了一个优化过的JavaScript函数,用于从API获取电影信息并渲染到网页上,同时注册Service Worker以提升用户体验和性能。 ... [详细]
  • 本文探讨了如何在Node.js环境中,通过Tor网络使用的SOCKS5代理执行HTTP请求。文中不仅提供了基础的实现方法,还介绍了几种常用的库和工具,帮助开发者解决遇到的问题。 ... [详细]
  • 深入解析ES6至ES8的新特性与应用
    本文详细介绍了自2015年发布的ECMAScript 6.0(简称ES6)以来,JavaScript语言的多项重要更新,旨在帮助开发者更好地理解和利用这些新特性进行复杂应用的开发。 ... [详细]
  • Python3 中使用 lxml 模块解析 XPath 数据详解
    XPath 是一种用于在 XML 文档中查找信息的路径语言,同样适用于 HTML 文件的搜索。本文将详细介绍如何利用 Python 的 lxml 模块通过 XPath 技术高效地解析和抓取网页数据。 ... [详细]
  • 本文介绍了如何使用Java代码在Android设备上检测特定应用程序是否已安装。通过创建一个Intent并利用PackageManager查询该Intent的可用性来实现这一功能。 ... [详细]
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
  • 本文详细介绍了JSP(Java Server Pages)的九大内置对象及其功能,探讨了JSP与Servlet之间的关系及差异,并提供了实际编码示例。此外,还讨论了网页开发中常见的编码转换问题以及JSP的两种页面跳转方式。 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • 本文探讨了如何通过WebBrowser控件在用户点击输入框时自动显示图片验证码。该过程可能涉及JavaScript事件的触发与响应。 ... [详细]
author-avatar
建哥2502897913
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有