[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 ...
随机推荐
- 使用Spring Data JPA 访问 Mysql 数据库-配置项
jpa操作数据库 注意:数据库采用的是本机数据库,下面是建表语句及初始化数据: SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------- ...
- 20201123 实验一《Python程序设计》实验报告
20201123 2020-2021-2 <Python程序设计>实验一报告 课程:<Python程序设计> 班级:2011班 姓名:晏鹏捷 学号:20201123 实验教师: ...
- 快速简单的了解VLAN(VXLAN)和端口链路类型
目录 前言 一.VLAN是什么? 1.优点 2.为什么推出VXLAN 二.VXLAN又是什么? 1.优点 三.创建VLAN 四.介绍端口链路类型 五.Access 1.特性 六.Trunk 1.特性 ...
- AWS上创建EKS(K8S)集群
1.注意事项及准备工作 EKS分为EKS Master和EKS Node两种角色;EKS Master为全托管,EKS Node为CloudFormation创建 EKS Node若在NAT网络里,一 ...
- k8s 1.12 环境部署及学习笔记
1.K8S概述 1.Kubernetes是什么 2.Kubernetes特性 3.Kubernetes集群架构与组件 4.Kubernetes核心概念 1.1 Kubernetes是什么 • Kube ...
- Netty 框架学习 —— 添加 WebSocket 支持
WebSocket 简介 WebSocket 协议是完全重新设计的协议,旨在为 Web 上的双向数据传输问题提供一个切实可行的解决方案,使得客户端和服务器之间可以在任意时刻传输消息 Netty 对于 ...
- Hibernate框架(二)POJO对象的操作
POJO对象其实就是我们的实体,这篇博客总结一下框架对POJO对象对应数据库主键的生成策略,和一些对POJO对象的简单增删改查的操作. 一,Hibernate框架中主键的生成策略有三种方式: 1,数据 ...
- WPF使用Microsoft.VisualBasic创建单例模式引起的权限降低问题
在进行WPF开发时,总是在找更加优雅去写单例模式的代码. 很多人都喜欢用Mutex,一个App.cs下很多的Mutex,我也喜欢用. 看完<WPF编程宝典>的第七章Applicaton类后 ...
- GitHub 多人协作开发 三种方式(转)
一.Fork 方式 网上介绍比较多的方式(比较大型的开源项目,比如cocos2d-x) 开发者 fork 自己生成一个独立的分支,跟主分支完全独立,pull代码后,项目维护者可根据代码质量决定是否me ...
- konga的初步使用
目录 1. 设置连接 2. konga的重要功能 Dashboard Snapshots Settings 3. 通过konga 实现kong api配置 前言: 在上篇文章中,我们已经创建了一个到k ...