事件循环是用来理解JavaScript的最重要的方面之一。这篇文章旨在解释JavaScript如何与单个线程一起工作的细节,以及它如何处理异步函数。

JavaScript代码运行是单线程。一次只执行一件事。这实际上是一个非常有用的限制,因为它简化了很多程序,从而不必担心并发问题。

您只需要注意编写代码的方式,避免任何可能阻塞线程的内容,如同步调用或无限循环。

通常,在大多数浏览器中,每个浏览器都有一个事件循环,以使每个进程隔离,并避免web页面具有无限循环或繁重的处理来阻塞整个浏览器。

你最需要担心的是,您的代码将在单个事件循环上运行,并在编写代码时考虑到这一点,以避免阻塞它。

阻止事件循环

任何花费太长时间将控制权返回给事件循环的JavaScript代码都会阻止页面中任何JavaScript代码的执行,甚至阻止UI线程,用户也无法点击,滚动页面等等。

几乎所有JavaScript中的I / O操作都是非阻塞的。网络请求,Node.js文件系统操作等。阻塞是个例外,这就是为什么JavaScript基于回调,以及最近的promises和async / await。

调用堆栈

调用堆栈是LIFO队列(Last In,FirstOut)。事件循环不断检查调用堆栈以查看是否存在需要运行的任何函数。

在执行此操作时,它会将它找到的任何函数调用添加到调用堆栈并按顺序执行每个调用。

一个简单的事件循环说明:

当此代码运行时,首先foo()调用。在foo()我们第一次调用bar(),然后我们调用baz()。

排队功能执行

上面的例子运行特点:JavaScript找到要执行的东西,按顺序运行它们。

让我们看看如何推迟函数直到堆栈清除:

用例setTimeout(()=> {}), 0)是调用一个函数,但是一旦执行了代码中的每个其他函数就执行它。

当此代码运行时,首先调用foo()。在foo()里面我们首先调用setTimeout,bar作为参数传递,然后我们指示它尽可能快地运行,将0作为计时器传递。然后我们调用baz()。

消息队列

调用setTimeout()时,浏览器或Node.js启动计时器。当计时器到期,我们将0作为超时,回调函数立即被放入消息队列中。

消息队列也是用户发起的事件(如单击事件、键盘事件或获取响应)在代码有机会对其作出响应之前排队的地方。或者像onLoad这样的DOM事件。

循环优先处理调用堆栈,它首先处理在调用堆栈中找到的所有东西,一旦调用堆栈中没有任何东西,它就会去获取事件队列中的东西。

我们不必等待像setTimeout,fetch或其他东西这样的函数来完成自己的工作,因为它们是由浏览器提供的,并且它们运行在自己的线程中。

ES6作业队列

ECMAScript 2015引入了Promises使用的作业队列概念(也在ES6 / ES2015中引入)。这是一种尽快执行异步函数结果的方法,而不是放在调用堆栈的末尾。

在当前函数结束之前解析的Prom将在当前函数之后立即执行。

我觉得在游乐园里过山车的比喻很好:消息队列将你放在队列的后面,在所有其他人的后面,你将不得不等待轮到你,而作业队列是快速通票这可以让你在完成上一个之后再骑一次。

这是Promises(和Async / await,它建立在promises上)和普通的旧异步函数setTimeout()或其他平台API 之间的巨大差异。

javascrit的事件循环是这门语言中非常重要且基础的概念。清楚的了解了事件循环的执行顺序和每一个阶段的特点,可以使我们对一段异步代码的执行顺序有一个清晰的认识,从而减少代码运行的不确定性。合理的使用各种延迟事件的方法,有助于代码更好的按照其优先级去执行。

作者:魏建民

javascript无限请求_JAVASCRIPT事件循环相关推荐

  1. JavaScript单线程异步的背后——事件循环机制

    感觉这篇文章拖了很久,好尴尬的拖延症 正文从这里开始--- 对JavaScript有个很模糊的印象,它是单线程异步的.本文主要来说说JavaScript到底是怎么运行的.但在这之前,让我们先理一下这些 ...

  2. JavaScript 如何工作的: 事件循环和异步编程的崛起 + 5 个关于如何使用 async/await 编写更好的技巧...

    原文地址:How JavaScript works: Event loop and the rise of Async programming + 5 ways to better coding wi ...

  3. [译] JavaScript 如何工作的: 事件循环和异步编程的崛起 + 5 个关于如何使用 async/await 编写更好的技巧...

    原文地址:How JavaScript works: Event loop and the rise of Async programming + 5 ways to better coding wi ...

  4. JavaScript单线程和浏览器事件循环简述

    JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...

  5. JavaScript执行机制-node事件循环

    node环境下的事件循环机制 和浏览器有什么不同? 在node中,事件循环表现出来的状态和浏览器大致相同,但是node有一套自己的模型. node事件循环依靠libuv引擎,node选择chrome ...

  6. javascript无限请求_SockJS - 重新连接后无限xhr-streaming呼叫

    即时通过SockJS和Spring websockets作为后端使用Stomp.偶尔,我的单块客户端重新连接后会出现问题(无线网络丢失,服务器故障,其他问题).连接完全恢复,但通过浏览器网络可以看到几 ...

  7. javascript事件循环Event Loop,宏任务与微任务

    1.javascript的运行机制介绍 javascript是单线程的语言,默认情况下一个时间点只能做一件事情,因此引入异步模型javascript是一门解释性脚本语言,即(边解释边运行) 2.阻塞式 ...

  8. JavaScript基础:浅聊事件循环(Event LooP)以及微任务,宏任务,DOM渲染

    一直说JavaScript是单线程的执行的(当然也可以通过其它其它的方式异步,本篇暂时不聊). 内核的组成 首先聊一下浏览器的内核组成部分,当然下面也不是全部,而只是说一些常见的. 主线线程 js引擎 ...

  9. 工作流 节点子线程_节点JS体系结构–单线程事件循环

    工作流 节点子线程 Today we will look into Node JS Architecture and Single Threaded Event Loop model. In our ...

最新文章

  1. QIIME 2用户文档. 15样品分类和回归q2-sample-classifier(2019.7)
  2. 基于单片机的贪吃蛇游戏设计_前端入门,基于html,css,javascript的贪吃蛇游戏
  3. virtualBox中的ubuntu共享文件夹
  4. 复杂网络表示的原理,算法和应用
  5. leetcode 497, 528. Random Point in Non-overlapping Rectangles | 497. 非重叠矩形中的随机点(Java)
  6. 事业单位考试考试【转载】
  7. python 放射 水平_基于Python的放射性核素大气扩散程序初步开发与验证
  8. Redis教程:数据对象分析(一)
  9. 排序系列 之 堆排序算法 —— Java实现
  10. gsettings set org.gnome.desktop.interface scaling-factor 2无效果
  11. cfar matlab,雷达无线电系列(二)经典CFAR算法图文解析与实现(matlab)
  12. matlab中pid参数整定,基于MATLAB/Simulink的PID参数整定
  13. MC9S12G128模块化分层化软件架构之八_QAC静态代码分析
  14. 幼儿园故事导入语案例_幼儿园故事教案导入语
  15. 人人都是产品经理总结 第三章1
  16. 【python批量插入图片到一个pdf中】
  17. java点名代码滚动_JAVA多线程实现简单的点名系统
  18. 让PhalApi返回的Json支持中文并且自带格式
  19. 迷你播放器--第一阶段(2)--退出时自动最小化(不是关闭),增加当前播放曲目的跑马灯效果
  20. Linux木马清理记录

热门文章

  1. linux arm. 快速启动,教你如何快速启动Linux 系统
  2. php 检查数据库查询结果,php数据库连接、查询、显示结果的小例子
  3. 不继承父类的某个属性_javascript中class的继承的基础用法
  4. 单片机音乐芯片c语言程序,51单片机驱动MT8880双音频接收发送芯片C语言程序分享...
  5. php openssl des ecb,php7.2 des-ede3-ecb加密报错:openssl_encrypt():Unknown cipher algorithm 落叶随风博客...
  6. cdn对动态网站有作用吗_网站选择cdn加速有什么作用?
  7. php与mysql关系大揭秘_【慕课笔记】PHP与MySQL关系大揭秘
  8. 带你入门SpringCloud 之 通过SpringCloud Bus 自动更新配置
  9. Oracle(四)多表查询
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的仓库物品管理系统