[JS]异步任务之事件循环
前言
常常会听到单线程和多线程这两个名词,单线程即一个时间段内程序从上到下执行任务,多线程即一个时间段内程序同时执行多个任务。

然而 JavaScript 是单线程的,它不像 Java 那样新开启一个线程执行任务。如果 JavaScript 要同时执行多个任务,需采取排队的方式实现。
任务队列
在 JavaScript 中,可以将任务分为两种,一种是同步任务,另一种是异步任务。同步任务指的是,在主线程上排队执行的任务,每个任务从上到下依次执行;异步任务指的是任务不进入主线程执行,而是进入到任务队列中排队。只有当主线程上的所有同步任务执行完毕之后,主线程才会读取任务队列,开始执行异步任务。
请转至“[JS]回调函数”一文,了解什么是回调函数以及“同步任务”的案例。
如果前一个任务耗时很长,后一个任务不能一直等待。特别是对于长时间执行的任务,其他的任务就不能及时得到执行。对于这类情况,JavaScript 在主线程执行完所有的任务之后,再去读取任务队列上的异步任务。

在主线程中有两个任务需要被执行,异步任务会进入到任务队列中等待主线程把同步任务全部执行完成,然后主线程开始轮询任务队列中的异步任务,将异步任务全部执行完成。
如图所示,其运行结果是 “hello javascript” 在 “hello async javascript” 之前。
事件循环
主线程中的所有同步任务执行完毕,再读取任务队列中的异步任务,这个过程是不断循环的。因此,这种运行机制称为事件循环(Event Loop)。
在异步任务中,任务被分为两种,即宏任务(macrotask)和微任务(microtask)。微任务的优先级比宏任务的优先级高,所以主线程读取任务队列中的异步任务时,会优先读取微任务。

如上图,红色背景的任务是一个异步任务,它需要等待主线程的绿色背景的任务被执行完毕之后,主线程才会执行异步任务中的代码。
举例,直观地体验宏任务和微任务在优先度上的区别:

如上图,Promise 属于异步任务中的微任务,它优先于 setTimeout 宏任务。主线程任务先执行,然后进入到任务队列,先执行微任务,然后再执行宏任务。
声明:本篇文章(随笔)仅作为个人观点,仅供参考,如有错误,请在评论区指正!
[JS]异步任务之事件循环的更多相关文章
- node.js的作用、回调、同步异步代码、事件循环
http://www.nodeclass.com/articles/39274 一.node.js的作用 I/O的意义,(I/O是输入/输出的简写,如:键盘敲入文本,输入,屏幕上看到文本显示输出.鼠标 ...
- JS 的线程、事件循环、任务队列简介
JS 是单线程的,但是却能执行异步任务,这主要是因为 JS 中存在事件循环(Event Loop)和任务队列(Task Queue). 事件循环:JS 会创建一个类似于 while (true) 的循 ...
- Node.js实战(九)之事件循环
Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高. Node.js 几乎每一个 API 都是支持回调函数的. Node ...
- js: 从setTimeout说事件循环模型
一.从setTimeout说起 setTimeout()方法不是ecmascript规范定义的内容,而是属于BOM提供的功能.查看w3school对setTimeout()方法的定义,setTimeo ...
- js的事件循环机制:同步与异步任务(setTimeout,setInterval)宏任务,微任务(Promise,process.nextTick)
javascript是单线程,一切javascript版的"多线程"都是用单线程模拟出来的,通过事件循环(event loop)实现的异步. javascript事件循环 事件循环 ...
- 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?
https://segmentfault.com/a/1190000012806637 https://www.jianshu.com/p/93d756db8c81 首先,请牢记2点: (1) JS是 ...
- JavaScript之JS单线程|事件循环|事件队列|执行栈
本博文基于知乎"JavaScript作用域问题?"一问,而引起了对JavaScript事件循环和单线程等概念与实践上的研究.深入理解. 一.概念 0.关键词:JavaScript单 ...
- 【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick
[摘要] 官网博文翻译,nodejs中的定时器 示例代码托管在:http://www.github.com/dashnowords/blogs 原文地址:https://nodejs.org/en/d ...
- 【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick
目录 Event Loop 是什么? Event Loop 基本解释 事件循环阶段概览 事件循环细节 timers pending callbacks poll阶段 check close callb ...
随机推荐
- Android集合中对象排序
如果将集合中的对象进行排序,最近使用了一个简单的方法解决了,随笔记下来. 主要思路: 首先,新建类实现Comparator<?>,这个类是做比较的关键类,一般做比较的类型 int 或 St ...
- 每日三道面试题,通往自由的道路5——JVM
茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 昨天既然我们聊到了JVM,那我们继续这一个话题 ...
- Linux-ansible批量管理
1.ansible批量管理服务概念 (1)是基于Python语言开发的自动化软件工具 (2)是基于SSH远程管理服务实现远程主机批量管理 2.ansible批量管理服务意义 (1)提高工作的效率 (2 ...
- 14、oracle sql语法
14.0.注释: 1.单行注释:-- 2.多行注释:/* */ 14.1.sqlplus中的set指令: 1.设置每行显示的数据长度: SET LINESIZE 500; #有效范围是1-32767, ...
- salesforce零基础学习(一百零四)Salesforce Optimizer
本篇参考: https://admin.salesforce.com/blog/2017/analyzing-org-salesforce-optimizer-webinar-recap 假设你在做一 ...
- 关于tinymce的一些记事
之前能看的懂一部分英文,但是总是没有全局观,以至于我之前使用tinymce一直都有一些疑问:那就是为什么我在tinymce初始化中添加了比如字体,字体大小等设置按钮,但是为什么在前 台没有办法现实出来 ...
- Defense:MS08067漏洞攻防渗透实验
实验环境 Windows XP SP3 IP:172.16.211.129 百度网盘:https://pan.baidu.com/s/1dbBGdkM6aDzXcKajV47zBw 靶机环境 ...
- IDEA部署了项目,其他页面可以正常访问,但访问tomcat的localhost:8080却出现404
解决方案 点击Edit Configurations 点击右边的加号, 把目录放在你tomcat目录下的ROOT目录.之后就可以正常运行了
- hdu 2093 成绩排名
思路: 没啥思路,就是定义结构体,跟题目,走,当时没想到对那个括号的处理,后面看了题解,才知道用个getchar直接判断 算是一个值得思考的点. 代码: #include<bits/stdc++ ...
- 小哈学Python ----XML
XML XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下: <data> <country name="Liechtenstein"> ...