10分钟了解js的宏任务和微任务
熟悉宏任务和微任务以及js(nodejs)事件循环机制,在写业务代码还是自己写库,或者看源码都是那么重要
看了部分文档,自己总结和实践了一下
js中同步任务、宏任务和微任务介绍
同步任务: 普通任务
宏任务(异步任务,包括各种DOM事件) 来自于h5规范
分类: I/O(网络,文件,数据库I/O) setTimeout setInterval requestAnimationFrame(下次页面重绘前所执行的操作, 浏览器环境才有) setImmediate(nodejs才有)
- 宏任务所处的队列:宏任务队列
- 第一个宏任务队列只执行一个任务,执行主线程js代码,
- 宏任务队列可以有多个任务
微任务(异步任务) 来自于h5规范
分类: new Promise().then(回调)、 process.nextTick()(nodejs才有)
- 微任务所处的队列:微任务队列
- 只有一个微任务队列
- 在上一个宏任务队列执行完毕后,如果有微任务队列就会执行微任务队列中的所有任务;
执行顺序
当主线程js代码(属于宏任务第一队列)执行完毕后,如果有微任务,则优先执行微任务(process.nextTick优先执行),然后才执行宏任务
nodejs事件轮询(循环)机制(宏任务)介绍(借助libuv(c / c++)库实现)
执行顺序:
- timer: 定时器阶段 计时和执行到点的回调函数 settimeout
- pending callbacks 处理某些系统操作(TCP连接错误等)
- idle prepare 准备工作(nodejs才有)
- poll 轮询阶段(轮询队列,可以理解为普通异步任务,如网络请求) 先进先出、依次同步取出轮询队列中第一个回调函数执行/知道队列为空 或者 达到系统最大限制
如果队列为空,并且设置过setImmediate,直接进入下一个check阶段(未设置:停留在当前poll阶段等待,直到队列添加了回调函数) - check阶段,查阶段,执行setImmediate(nodejs才有)
- close callbacks 关闭阶段,执行close事件
举个栗子
console.log('start') // 顺序1 主线程同步任务
setTimeout(() => { // 顺序6 宏任务,按照事件轮询机制执行
console.log('setTimeout')
}, 0);
new Promise((resolve, reject) => { // new promise 属于同步主线程任务,优先执行 顺序2
for (let i = 0; i < 5; i++){ // 同步执行主线程任务
console.log(i)
}
setTimeout(() => {
console.log('promise settimeout') // 顺序7 次于上一个异步任务
}, 0);
resolve()
}).then(() => {
console.log('Promise回调执行完毕') // 顺序5 new Promise().then(回调)属于微任务 优于宏任务执行
})
setImmediate(function (params) { // 顺序8 宏任务执行,按照事件轮询机制执行
console.log('setImmediate')
})
process.nextTick(function (params) { // 特例:在同步任务结束后,微任务如果有process.nextTick,优先执行 顺序4
console.log('nextTick')
})
console.log('main process end') // 顺序3 主线程同步任务
// start
// 0
// 1
// 2
// 3
// 4
// main process end
// nextTick
// Promise回调执行完毕
// setTimeout
// setImmediate
/**
setImmediate 和 setTimeout 的优先级
一般根据定时器setTimeout waittime决定
*/
var t1 = +new Date();
setImmediate(function () {
console.log('1');
});
setTimeout(function () {
console.log('2');
},20);
console.log('3');
var t2 = +new Date();
console.log('time: ' + (t2 - t1));
//输出
// 3
// time: 23
// 2
// 1
var t1 = +new Date();
setImmediate(function () {
console.log('1');
});
setTimeout(function () {
console.log('2');
},30);
console.log('3');
var t2 = +new Date();
console.log('time: ' + (t2 - t1));
//输出
// 3
// time: 23
// 1
// 2
10分钟了解js的宏任务和微任务的更多相关文章
- js为什么是单线程的?10分钟了解js引擎的执行机制
深入理解JS引擎的执行机制 1.JS为什么是单线程的? 为什么需要异步? 单线程又是如何实现异步的呢? 2.JS中的event loop(1) 3.JS中的event loop(2) 4.说说setT ...
- 10分钟理解JS引擎的执行机制
首先,请牢记2点: (1) JS是单线程语言 (2) JS的Event Loop是JS的执行机制.深入了解JS的执行,就等于深入了解JS里的event loop 1.灵魂三问 (1) JS为什么是单线 ...
- 10分钟用JS实现微信 "炸屎"大作战
大家好,我是秋风,近日,微信又发布了新功能(更新到微信8.0.6).最火热的非"炸屎"功能莫属了,各种群里纷纷玩起了炸屎的功能. 不知道大家是否经历过那样一个时候,小时候(我是说很 ...
- 转:10分钟了解JS堆、栈以及事件循环的概念
https://juejin.im/post/5b1deac06fb9a01e643e2a95?utm_medium=fe&utm_source=weixinqun 前言 其实一开始对栈.堆的 ...
- 10分钟学会js处理json常用方法
一.json定义 JSON ( JavaScript Object Notation) ,它是一串字符串 只不过元素会使用特定的符号标注. {} 双括号表示对象 [] 中括号表示数组 "&q ...
- js的事件循环机制:同步与异步任务(setTimeout,setInterval)宏任务,微任务(Promise,process.nextTick)
javascript是单线程,一切javascript版的"多线程"都是用单线程模拟出来的,通过事件循环(event loop)实现的异步. javascript事件循环 事件循环 ...
- JavaScript 10分钟入门
JavaScript 10分钟入门 随着公司内部技术分享(JS进阶)投票的失利,先译一篇不错的JS入门博文,方便不太了解JS的童鞋快速学习和掌握这门神奇的语言. 以下为译文,原文地址:http://w ...
- 不用搭环境的10分钟AngularJS指令简易入门01(含例子)
不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...
- 10分钟弄懂javascript数组
建议阅读时间 : 10分钟 主要内容:javascript数组的基本概念.属性.方法 新建数组: var arr01 = ["a","b","c&qu ...
随机推荐
- 「疫期集训day1」无言
正式集训第一天,感觉没啥特别大的感受,无非是奥赛时间延长了,效率提高了,身外事少了 当然不止这些 感受1:有些曾经被恶的题现在仍然在恶心,例如昨天的farmcraft,今天的整数划分(和着多边形一块调 ...
- c++随机生成树
分析 当我们写完一道题,自认为它是正解,但是交上去却WA的时候,我们该怎么办呢 当我们已经想出了一道的暴力解法,又想出了一种比较优秀的解法,但不知道这种解法对错与否,我们该怎么办呢 答案显然是对拍 对 ...
- C++各种格式转换
int main() { stringstream sstr; //--------int转string----------- int a=100; string st ...
- 从0开始,手把手教你开发并部署上线一个知识测验微信小程序
上线项目演示 微信搜索[放马来答]或扫以下二维码体验: 项目源码 项目源码 其他版本 Vue答题App实战教程 Hello小程序 1.注册微信小程序 点击立即注册,选择微信小程序,按照要求填写信息 2 ...
- Linux超强截图工具flameshot
Pop!_OS自带的截屏快捷键如下 但讲道理这个是真的不好用 所以我们借助第三方的截图工具,这里推荐flameshot(火焰截图) 在终端键入以下命令即可安装 sudo apt update sudo ...
- python 装饰器(六):装饰器实例(三)内置装饰器
内置的装饰器和普通的装饰器原理是一样的,只不过返回的不是函数,而是类对象,所以更难理解一些. @property 在了解这个装饰器前,你需要知道在不使用装饰器怎么写一个属性. def getx(sel ...
- Python之爬虫从入门到放弃(十三) Scrapy框架整体的了解
这里是通过爬取伯乐在线的全部文章为例子,让自己先对scrapy进行一个整理的理解 该例子中的详细代码会放到我的github地址:https://github.com/pythonsite/spider ...
- Quartz.Net系列(十二):六大Calendar(Annual、Cron、Daily、Holiday、Monthly、Weekly)
Quartz.Net中为了动态排除一些时间,而使用Calendar可以做到 1.DailyCalendar 可以动态的排除一天中的某些时间段 示例:在一天当中的13:00到14:00不要执行 publ ...
- bzoj3732Network
bzoj3732Network 题意: 给一个无向图,k个询问求节点a到节点b最长边的最小值.n,k≤15000. 题解: ”最长边的最小值“经常可以用最小生成树解决,因为生成树里的每一条边都是可取的 ...
- Crystal Reports --报表设计
完整的报表解决方案 数据访问—>报表设计—>报表管理—>与应用系统集成 一.规划报表 设计报表的准备工作 谁看报表? 报表的数据是什么?(页眉页脚的内容?是否需要分组?是否需要汇总? ...