JS线程与事件循环解析

  JS是单线程,JS代码从上到下依次执行,但是单线程有一个非常大的问题,遇到耗时的任务,后面的任务只能等待它执行完,才能接着执行。比如ajax请求,从服务器上获取数据,本身是耗时的,如果遇到网络波动,就更耗时,只能等待它的返回结果再接着执行后面的任务。如果处在渲染阶段,也会阻塞渲染。

  基于此,JS引入了异步的概念,当遇到耗时的任务,JS将其压入事件队列,先执行后面的任务,等主线程的任务执行完毕,再处理事件队列中的任务。以ajax请求为例,当JS执行到ajsx函数的时候,其实是去告诉浏览器执行http请求,然后立即返回主线程栈执行后面的任务,当浏览器拿到服务器返回数据,将数据传给ajax回调函数,并将回调函数压入到事件队列中。当主线程的任务全部执行完,就会去轮询事件队列,一旦发现事件队列的回掉函数,依次取出放至执行栈中执行;在程序执行过程中,js会一直执行轮询,直到程序结束。

  JS主线程工作流程:JS代码加载完成,创建全局执行环境,至上而下依次执行任务。遇到非异步函数,将创建函数执行环境,函数执行完即销毁,执行下个任务;直到全局执行环境代码执行完毕,执行栈为空。

  JS事件循环队列流程:当执行栈为空,JS会去轮询事件队列,在事件队列取起始位置第一个任务(注册的回调函数)放到执行栈中执行,等回调函数执行完毕,执行栈为空,再次轮询事件队列,步骤如上。在整个程序执行过程中,js会一直轮询事件队列,一有任务就会执行上述过程,该过程称为事件循环。

  注意:所有程序都在执行栈中执行,只有执行栈为空,才有能力执行下一个任务。所以这也要求,回调函数中不能执行太多任务,如果执行太多任务,栈就不为空,也就阻止了下一个任务的执行,造成阻塞。

  promise.then,process.nextTick, setTimeout 以及 setImmediate 的执行顺序:

setImmediate(function(){console.log(1);
},0);
setTimeout(function(){console.log(2);
},0);
new Promise(function(resolve){console.log(3);resolve();console.log(4);
}).then(function(){console.log(5);
});
console.log(6);
process.nextTick(function(){console.log(7);
});
console.log(8);// 3 4 6 8 7 5 2 1

关于优先级:

  每次轮询事件队列,各观察者的优先级为:

  idle观察者》I/O观察者》check观察者

  idle观察者:process.nextTick

  I/O观察者:一般性的I/O回调,如网络,文件,数据库I/O等

  check观察者:setTimeout>setImmediate

  注:promise本身不是异步函数 且优先级大于async

 

 

    

 

  

转载于:https://www.cnblogs.com/xuxiaoqiangAndHM/p/10903599.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Camel中的断路器模式

骆驼通常在分布式环境中用于访问远程资源。 远程服务可能由于各种原因和期间而失败。 对于短时间后暂时不可用且可恢复的服务,重试策略可能会有所帮助。 但是某些服务可能会失败或挂起更长时间,从而使调用应用程序无响应且速度缓慢。 防止级联故障和关键…

深入学习决策树算法原理

分类技术(或分类法)是一种根据输入数据建立分类模型的系统方法,分类法的例子包括决策分类法,基于规则的分类法,神经网络,支持向量机和朴素贝叶斯分类法。这些技术都使用一种学习算法(learning a…

HTML 页面自动刷新

学习就是一个不断积累的过程&#xff0c;每一天能够学到一点新东西说明自己就在进步&#xff01;&#xff01; HTML head 里面设置页面自动刷新功能 <meta http-equiv"Refresh" content"2"> <meta http-equiv"X-UA-Compatible" cont…

linux 编译安装python,linux下编译安装python2.7.6

安装依赖开发包yum install readline-develyum install *argparse*wget https://www.python.org/ftp/python/2.7.6/Python2.7.6.tgzipython 下载地址https://github.com/ipython/ipython/releases/download/rel-2.1.0/ipython-2.1.0.tar.gz编译安装python 2.7.6[[email protec…

kotlin访问控制符可见性

名称访问权限public&#xff08;默认&#xff09;该权限符修饰的成员可以在任何地方被访问internal该权限符修饰的成员可以在该类的内部或者文件的内部或者同一个模块内被访问protected该权限符修饰的成员可以在该类的内部或者文件的内部或者其子类中被访问private该权限符修饰…

JDK 8中方便的新地图默认方法

Map接口在JDK 8中提供了一些方便的新方法 。 因为我在本文中介绍的Map方法是作为默认方法实现的&#xff0c;所以Map接口的所有现有实现都享有默认方法中定义的默认行为&#xff0c;而无需任何新代码。 这篇文章中介绍的JDK 8引入的Map方法是getOrDefault&#xff08;Object&am…

JS观察者模式-自定义事件

111转载于:https://www.cnblogs.com/zoeeying/p/10139131.html

linux中下载的服务压缩包存放在,linux 下tomcat6 配置为服务

本人从官网http://tomcat.apache.org/上面下载的6.0.1_31版本&#xff0c;并解压包后改名存放在&#xff1a;/usr/share/tomcat6本人使用的是root用户登录&#xff0c;下面就说说具体的操作步骤&#xff0c;1、在/usr/share/tomcat6/bin中有commons-daemon-native.tar.gz压缩包…

Java 8 Friday Goodies:精益并发

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 &#xff0c;现在我们觉得是时候开始一个新的博客系列了…

Floyd最短路(带路径输出)

摘要(以下内容来自百度) Floyd算法又称为插点法&#xff0c;是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法&#xff0c;与Dijkstra算法类似。 该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特弗洛伊德命名。 简介编辑 在…

CSS 小结笔记之清除浮动

浮动是一个非常好用的属性&#xff0c;但是有时会出现一些问题&#xff0c;需要进行清除浮动。例如 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…

jsp分割字符串并遍历

1、先引入JSTL库 <% taglib uri"http://java.sun.com/jsp/jstl/core" prefix"c"%> 2、分割字符串并遍历&#xff08;按“,”分割&#xff09; <c:forTokens items"${danger.imagesPath}" delims"," var"file"> …

linux shell 脚本 父子进程 等待子进程,SHELL父子进程分析

导言本节将就shell交互(脚本执行)过程中涉及子进程(subprocess)以及子SHELL(subshell)的部分&#xff0c;配以实例&#xff0c;进行说明。将详细讨论如下问题&#xff1a;subprocess和subshell是什么subprocess的产生过程是什么什么情况下会产生subprocess和subshellshell编程中…

百里香Spring测试的意见

我最近将其转换为thymeleaf &#xff0c;以便在基于Spring的Web应用程序中进行视图模板化&#xff0c;而不是jsp。 百里香叶文档中所有关于为什么百叶香叶在jsp上为何能保持水分的争论都被我肯定了。 除了能够预览模板之外&#xff0c;对我来说&#xff0c;主要原因之一是视图…

路由与交换--交换机常用配置及其实验案例

1 交换机常用配置命令 1.1 配置主机名与口令 Switch>enable Switch#config t Switch(config)#hostname SA SA(config)#enable password cisco&#xff08;明文&#xff09; SA(config)#enable secret cisco&#xff08;暗文&#xff09; SA(config)#exit SA#show running-co…

js使用工具将表单封装成json字符串传到后台,js截取字符串(学生笔记)

<script src"js/jquery.min.js"></script><script src"https://cdn.bootcss.com/jquery.serializeJSON/2.9.0/jquery.serializejson.js"></script><script>// / //原始版本// $("#1").click(function(){// …

linux自动启动network服务,Windows/Linux 创建开机启动服务

系统服务是一种应用程序类型&#xff0c;它在后台运行。服务应用程序通常可以在本地和通过网络为用户提供一些功能。有些软件无需安装解压就能使用&#xff0c;或者在安装时未向系统注册服务。如果我们需要开机启动&#xff0c;需要手动创建服务。Windows系统篇相对于在注册表中…

对 Vue 的理解(一)

一、什么是 Vue ? 首先&#xff0c;Vue 是一个 MVVM 框架&#xff0c;M -- 模型&#xff0c;就是用来定义驱动的数据&#xff0c;V -- 视图&#xff0c;是经过数据改变后的 html&#xff0c;VM -- 框架视图&#xff0c;就是用来实现双向绑定的中间桥梁。Vue.js 是采用数据劫持…

Nginx做前端Proxy时TIME_WAIT过多的问题

我们的DSP系统目前基本非凌晨时段的QPS都在10W以上&#xff0c;我们使用Golang来处理这些HTTP请求&#xff0c;Web服务器的前端用Nginx来做负载均衡&#xff0c;通过Nginx的proxy_pass来与Golang交互。由于nginx代理使用了短链接的方式和后端交互的原因&#xff0c;使得系统TIM…

JDK 8功能的可疑方面

我们大多数使用Java进行开发的人通常都热衷于JDK 8附带的功能和改进。 但是&#xff0c;最近有几篇文章指出了某些功能可能会被滥用和滥用&#xff0c;并可能在将来导致其他问题。 这些功能使我想起了J2SE 5中引入的自动装箱功能&#xff0c;虽然有其有用的情况&#xff0c;但是…