[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 ...
随机推荐
- Redis的bitmap从基础到业务
1. 位与字节 1个字节(byte)等于8个位(bit).(计算机常识). 2. string与bitmap Redis里的bitmap是属于string这个数据类型里的.可以help进行查看bit相 ...
- uniapp 微信小程序 打开文件
uni.downloadFile({ url: item.url, success: (res) => { if (res.statusCode === 200) { uni.openDocum ...
- Python | 更换pip源到国内镜像
pip国内的一些镜像 阿里云 https://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simpl ...
- Maven安装、配置及基础
简介: Maven是Apache公司的开源项目,是项目构建工具,用来管理依赖. Maven的优点: 同样的代码实现相同的功能,Maven项目没有Jar包,项目大小更小. maven的优点如何实现: 没 ...
- 基于Vue/React项目的移动端适配方案
本文的目标是通过下文介绍的适配方案,使用vue或react开发移动端及H5的时候,不需要再关心移动设备的大小,只需要按照固定设计稿的px值布局,提升开发效率. 下文给出了本人分别使用create-re ...
- MyBatis框架中的条件查询!关键字exists用法的详细解析
exists用法 exists: 如果括号内子查询语句返回结果不为空,说明where条件成立,就会执行主SQL语句 如果括号内子查询语句返回结果为空,说明where条件不成立,就不会执行主SQL语句 ...
- 一款不错的 Go Server/API boilerplate,使用 K8S+DDD+CQRS+ES+gRPC 最佳实践构建
Golang API Starter Kit 该项目的主要目的是使用最佳实践.DDD.CQRS.ES.gRPC 提供样板项目设置. 为开发和生产环境提供 kubernetes 配置.允许与反映生产的 ...
- docker挂载数据卷
1.Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷,简单的理解就是将数据持久化的工具. 2.在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们 ...
- python django与celery的集成
一.celery与django 关于celery介绍和使用可以查看上篇Python中任务队列-芹菜celery的使用 关于django的介绍和使用可查看python django框架+vue.js前后 ...
- 高质量代码优化!谈谈重构项目中if-else代码的几点建议
switch if - else只适合在3层之内使用 当条件判断较多时,可以首先考虑使用switch interface 当判断条件还可能动态增加时,可以考虑将switch进一步优化,引入接口inte ...