【js基础修炼之路】- 微任务,宏任务和Event-Loop
一段代码让你了解Event-Loop
console.log(1);
setTimeout(() => {
console.log(2);
}, 0);
new Promise((resolve, reject) => {
console.log(3);
resolve();
}).then(data => {
console.log(4);
setTimeout(() => {
console.log(5);
}, 0);
});
讲解之前先看一段代码,可以先预测一下代码的执行结果,首先打印了1,然后是一个定时器,因为js是单线程,所以代码不会等到定时器执行完在继续代码,定时器会放到异步队列里面,等到合适的时机再执行。再下面是一个promise,那么promise什么时候执行呢?

上面这张图片是代码执行的具体过程,console.log(1)是同步代码,直接执行,遇到定时器后,定时器是异步任务,定时器的时间到了会马上把回调函数加入宏任务队列里面,Promise是同步任务,直接执行,promise().then是一个微任务,所以把console.log(4)放到了微任务的队列,接着里面是一个定时器,时间到了就把定时器放到了宏任务队列里面,当主线程的代码执行完毕,会检查微任务队列里面是否有代码没执行,有代码的话就一并执行,如果没有,宏任务队列里面的代码会依次进入主线程,直到宏任务为空。这样一分析,代码的执行顺序就很清晰了,分别是1 3 4 2 5。
(1)所有同步任务都在主线程上执行,形成一个 执行栈 。
(2)主线程之外,还存在一个"宏任务队列" 。只要异步任务有了运行结果(例如定时器的时间到了,或者ajax请求回来数据了等等),就在"宏任务队列"之中放置一个事件(对应的回调函数)。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"微任务队列"里面的任务,微任务执行完,再看看"宏任务队列"里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。
说了那么多,Event-Loop到底是啥?
上面一直在说微任务,宏任务,当前执行栈,浏览器怎么能知道什么时候执行宏任务,什么时候执行微任务,其实有一个这样的机制不断检查是否该执行微任务了,或者宏任务。(这是个非常简易的描述了,实际上会复杂很多)而这样的操作就被称为Event Loop。
微任务和宏任务都有哪些
宏任务
| * | 浏览器 | node |
|---|---|---|
| I/O | ✅ | ✅ |
| setTimeout | ✅ | ✅ |
| setInterval | ✅ | ✅ |
| setImmediate | ❌ | ✅ |
| requestAnimationFrame | ✅ | ❌ |
微任务
| * | 浏览器 | node |
|---|---|---|
| Promise.then catch finally | ✅ | ✅ |
| process.nextTick | ❌ | ✅ |
| MutationObserver | ✅ | ❌ |
【js基础修炼之路】- 微任务,宏任务和Event-Loop的更多相关文章
- 【js基础修炼之路】- 手把手教你实现bind
手写bind前我们先回顾一下bind有哪些特性,以便更好的理解bind和实现bind. bind的特性 var obj = { a: 100, say(one, two) { console.log( ...
- 【js基础修炼之路】— 深入浅出理解闭包
之前对于闭包的理解只是很肤浅的,只是浮于表面,这次深究了一下闭包,下面是我对闭包的理解. 什么是闭包? 引用高程里的话 => 闭包就是有权访问另一个作用域中变量的函数,闭包是由函数以及创建该函数 ...
- 【js基础修炼之路】— 我理解的原型链
提起原型链,大家并不陌生,但是对于新人来说一提到原型方面的东西就会比较懵.在我自一次面试的时候,面试官也给我提了这样的问题,当时就按照我的理解说了一些,但是很肤浅,在此我希望给刚入门的前端小伙伴聊一下 ...
- 【js基础修炼之路】— null和undefined的区别
在近期的复习期间遇到null和nudefined,于是通过查找资料,想写一篇文章来说明他们的区别.. javaScript高级程序设计: 在使用var声明变量但未对其加以初始化时,这个变量的值就是un ...
- 【js基础修炼之路】--创建文档碎片document.createDocumentFragment()
讲这个方法之前,我们应该先了解下插入节点时浏览器会做什么. 在浏览器中,我们一旦把节点添加到document.body(或者其他节点)中,页面就会更新并反映出这个变化,对于 ...
- 【css基础修炼之路】— 谈谈元素的垂直水平居中
作为一个初级的前端工程师,在开发的过程中遇到了许多问题,其中使元素垂直居中这个问题难住了我,可能在大家看来这是一个非常小的问题,但是却困扰了我很长时间,于是决定做一个总结!!! 废话不多说,直接上代码 ...
- Java工程师修炼之路(校招总结)
Java工程师修炼之路(校招总结) 前言 在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾讯,今日头条,网易, ...
- 前端JS基础知识
1. 原型 / 构造函数 / 实例 原型(prototype): 一个简单的对象,用于实现对象的 属性继承.可以简单的理解成对象的爹.在 Firefox 和 Chrome 中,每个JavaScript ...
- Js基础知识(四) - js运行原理与机制
js运行机制 本章了解一下js的运行原理,了解了js的运行原理才能写出更优美的代码,提高运行效率,还能解决开发中遇到的不理解的问题. 进程与线程 进程是cpu资源分配的最小单位,进程可以包含多个线程. ...
随机推荐
- ListItemType.AlternatingItem 和 ListItemType.Item
项目中后台绑定Reapter项时,判断 if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.Alte ...
- newCachedThreadPool无上限线程池使用
1. newCachedThreadPool无上限线程池, 动态根据代码添加线程, 如果线程空闲60秒没有被使用,会自动关闭 package ThreadTest; import java.u ...
- logback error 分开存日志
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property ...
- sqlserver 索引进阶(下)
参考原文 http://www.cnblogs.com/tjy9999/p/4494799.html 第十级, 索引内部结构 建立索引的目的是加快对表中记录的查找或排序.为表设置索引要付出代价的:一是 ...
- 使用Spring和JQuery实现视频文件的上传和播放
Spring MVC可以很方便用户进行WEB应用的开发,实现Model.View和Controller的分离,再结合Spring boot可以很方便.轻量级部署WEB应用,这里为大家介绍如何使用Spr ...
- 单点登录-JWT(Json Web Tokens)
来自:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html 1.跨域认证 1.用户向服务器发送用户名和密码. 2.服务 ...
- 在Docker中部署Asp.net core2.1以及修改发布
https://blog.csdn.net/sd7o95o/article/details/80809734 本篇文章主要是如何在Docker容器中运行ASP.NET Core应用程序,以及修改系 ...
- mgo01_window server 2012上安装mongo4.0
目前mongo最新版为4.0(2018-07-18),下载地址 https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-4 ...
- mapreduce统计总数
现有某电商网站用户对商品的收藏数据,记录了用户收藏的商品id以及收藏日期,名为buyer_favorite1. buyer_favorite1包含:买家id,商品id,收藏日期这三个字段,数据以“\t ...
- spring和springmvc父子容器关系
一般来说,我们在整合spring和SpringMVC这两个框架中,web.xml会这样写到: <!-- 加载spring容器 --> <!-- 初始化加载application.xm ...