前言

常常会听到单线程和多线程这两个名词,单线程即一个时间段内程序从上到下执行任务,多线程即一个时间段内程序同时执行多个任务。

然而 JavaScript 是单线程的,它不像 Java 那样新开启一个线程执行任务。如果 JavaScript 要同时执行多个任务,需采取排队的方式实现。

任务队列

在 JavaScript 中,可以将任务分为两种,一种是同步任务,另一种是异步任务。同步任务指的是,在主线程上排队执行的任务,每个任务从上到下依次执行;异步任务指的是任务不进入主线程执行,而是进入到任务队列中排队。只有当主线程上的所有同步任务执行完毕之后,主线程才会读取任务队列,开始执行异步任务。

请转至“[JS]回调函数”一文,了解什么是回调函数以及“同步任务”的案例。

如果前一个任务耗时很长,后一个任务不能一直等待。特别是对于长时间执行的任务,其他的任务就不能及时得到执行。对于这类情况,JavaScript 在主线程执行完所有的任务之后,再去读取任务队列上的异步任务。

在主线程中有两个任务需要被执行,异步任务会进入到任务队列中等待主线程把同步任务全部执行完成,然后主线程开始轮询任务队列中的异步任务,将异步任务全部执行完成。

如图所示,其运行结果是 “hello javascript” 在 “hello async javascript” 之前。

事件循环

主线程中的所有同步任务执行完毕,再读取任务队列中的异步任务,这个过程是不断循环的。因此,这种运行机制称为事件循环(Event Loop)。

在异步任务中,任务被分为两种,即宏任务(macrotask)和微任务(microtask)。微任务的优先级比宏任务的优先级高,所以主线程读取任务队列中的异步任务时,会优先读取微任务。

如上图,红色背景的任务是一个异步任务,它需要等待主线程的绿色背景的任务被执行完毕之后,主线程才会执行异步任务中的代码。

举例,直观地体验宏任务和微任务在优先度上的区别:

如上图,Promise 属于异步任务中的微任务,它优先于 setTimeout 宏任务。主线程任务先执行,然后进入到任务队列,先执行微任务,然后再执行宏任务。

声明:本篇文章(随笔)仅作为个人观点,仅供参考,如有错误,请在评论区指正!

[JS]异步任务之事件循环的更多相关文章

  1. node.js的作用、回调、同步异步代码、事件循环

    http://www.nodeclass.com/articles/39274 一.node.js的作用 I/O的意义,(I/O是输入/输出的简写,如:键盘敲入文本,输入,屏幕上看到文本显示输出.鼠标 ...

  2. JS 的线程、事件循环、任务队列简介

    JS 是单线程的,但是却能执行异步任务,这主要是因为 JS 中存在事件循环(Event Loop)和任务队列(Task Queue). 事件循环:JS 会创建一个类似于 while (true) 的循 ...

  3. Node.js实战(九)之事件循环

    Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高. Node.js 几乎每一个 API 都是支持回调函数的. Node ...

  4. js: 从setTimeout说事件循环模型

    一.从setTimeout说起 setTimeout()方法不是ecmascript规范定义的内容,而是属于BOM提供的功能.查看w3school对setTimeout()方法的定义,setTimeo ...

  5. js的事件循环机制:同步与异步任务(setTimeout,setInterval)宏任务,微任务(Promise,process.nextTick)

    javascript是单线程,一切javascript版的"多线程"都是用单线程模拟出来的,通过事件循环(event loop)实现的异步. javascript事件循环 事件循环 ...

  6. 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?

    https://segmentfault.com/a/1190000012806637 https://www.jianshu.com/p/93d756db8c81 首先,请牢记2点: (1) JS是 ...

  7. JavaScript之JS单线程|事件循环|事件队列|执行栈

    本博文基于知乎"JavaScript作用域问题?"一问,而引起了对JavaScript事件循环和单线程等概念与实践上的研究.深入理解. 一.概念 0.关键词:JavaScript单 ...

  8. 【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick

    [摘要] 官网博文翻译,nodejs中的定时器 示例代码托管在:http://www.github.com/dashnowords/blogs 原文地址:https://nodejs.org/en/d ...

  9. 【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick

    目录 Event Loop 是什么? Event Loop 基本解释 事件循环阶段概览 事件循环细节 timers pending callbacks poll阶段 check close callb ...

随机推荐

  1. Redis的bitmap从基础到业务

    1. 位与字节 1个字节(byte)等于8个位(bit).(计算机常识). 2. string与bitmap Redis里的bitmap是属于string这个数据类型里的.可以help进行查看bit相 ...

  2. uniapp 微信小程序 打开文件

    uni.downloadFile({ url: item.url, success: (res) => { if (res.statusCode === 200) { uni.openDocum ...

  3. Python | 更换pip源到国内镜像

    pip国内的一些镜像 阿里云 https://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simpl ...

  4. Maven安装、配置及基础

    简介: Maven是Apache公司的开源项目,是项目构建工具,用来管理依赖. Maven的优点: 同样的代码实现相同的功能,Maven项目没有Jar包,项目大小更小. maven的优点如何实现: 没 ...

  5. 基于Vue/React项目的移动端适配方案

    本文的目标是通过下文介绍的适配方案,使用vue或react开发移动端及H5的时候,不需要再关心移动设备的大小,只需要按照固定设计稿的px值布局,提升开发效率. 下文给出了本人分别使用create-re ...

  6. MyBatis框架中的条件查询!关键字exists用法的详细解析

    exists用法 exists: 如果括号内子查询语句返回结果不为空,说明where条件成立,就会执行主SQL语句 如果括号内子查询语句返回结果为空,说明where条件不成立,就不会执行主SQL语句 ...

  7. 一款不错的 Go Server/API boilerplate,使用 K8S+DDD+CQRS+ES+gRPC 最佳实践构建

    Golang API Starter Kit 该项目的主要目的是使用最佳实践.DDD.CQRS.ES.gRPC 提供样板项目设置. 为开发和生产环境提供 kubernetes 配置.允许与反映生产的 ...

  8. docker挂载数据卷

    1.Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷,简单的理解就是将数据持久化的工具. 2.在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们 ...

  9. python django与celery的集成

    一.celery与django 关于celery介绍和使用可以查看上篇Python中任务队列-芹菜celery的使用 关于django的介绍和使用可查看python django框架+vue.js前后 ...

  10. 高质量代码优化!谈谈重构项目中if-else代码的几点建议

    switch if - else只适合在3层之内使用 当条件判断较多时,可以首先考虑使用switch interface 当判断条件还可能动态增加时,可以考虑将switch进一步优化,引入接口inte ...