热门标签 | 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/...


   



推荐阅读
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文提供了使用Java实现Bellman-Ford算法解决POJ 3259问题的代码示例,详细解释了如何通过该算法检测负权环来判断时间旅行的可能性。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • Linux设备驱动程序:异步时间操作与调度机制
    本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
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社区 版权所有