前言

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

然而 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. js-动态表单校验-吐血总结最近遇到的变态表单校验2---element+原生

    上一部分总结了基础常用的js表单校验,包括原生以及框架,下面来总结这一个月涉及到的动态校验: 动态表单校验大致分为三种情况: 1. 首先是固定校验规则,但是表单组件是动态生成的,例如:在表单或者表格里 ...

  2. npm 操作代码

    npm cache clean -force    //强制清除缓,比如安装echarts失败后,清除,在安装

  3. 一个排序引发的BUG

    你好呀,我是why. 前两天在 Git 上闲逛的时候又不知不觉逛到 Dubbo 那里去了. 看了一下最近一个月的数据,社区活跃度还是很高的: 然后看了一下最新的 issue,大家提问都很积极. 其中看 ...

  4. centos使用yum安装docker

    1.先决条件 要安装 Docker 引擎,您需要 CentOS 7 或 8 的维护版本.不支持或测试存档版本. 该centos-extras库必须启用.默认情况下启用此存储库,但如果您已禁用它,则需要 ...

  5. 试着给VuePress添加渐进式Web应用(PWA)支持,基于vuepress/plugin-pwa,点亮离线访问

    背景 有时候,我们也希望VuePress构建的文档中心能支持离线访问,这时候我们需要给他添加渐进式Web应用(PWA,Progressive Web App)的支持,根据官方文档指引,我们可以借助插件 ...

  6. 2020牛客NOIP赛前集训营-普及组(第二场) 题解

    目录 T1 面试 描述 题目描述 输入描述: 输出描述: 题解 代码 T2 纸牌游戏 描述 题目描述 输入描述: 输出描述: 题解 代码 T3 涨薪 描述 题目描述 输入描述: 输出描述: 题解 代码 ...

  7. 1.5Java、万维网以及其他

    要点提示:Java是一种功能强大和多用途的编程语言,可用于开发运行在移动设备.台式计算机以及服务器端的软件.

  8. namenode和datanode启动失败

    1.namenode启动失败,查看错误原因,是无法格式化,再看日志,根据日志提示,清空对应的目录,即可解决这个问题. 2.datanode启动失败: Can't open /var/run/cloud ...

  9. 青蛙跳台阶问题(斐波那契数列) python

    一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法 class Solution: def jump(self,n): if n ==0: return 0 el ...

  10. 【分布式】CAP理论及其应用

    CAP Theorem CAP 指的就是 "consistency 一致性","availability 可用性" "partition-tolera ...