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 ...
随机推荐
- Python——读取大文件(GB)
最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法. Prelimi ...
- URL编码转换函数:escape()、encodeURI()、encodeURIComponent()讲解
转自:https://www.cnblogs.com/douJiangYouTiao888/p/6473874.html 函数出现时间: escape() ...
- Django---进阶14
目录 登陆功能 首页搭建 admin后台管理 用户头像展示 图片防盗链 个人站点 侧边栏筛选功能 登陆功能 def login(request): if request.method == 'POST ...
- 关于点击input框唤醒键盘导致input被遮盖的问题
关于点击input框唤醒键盘导致input被遮盖的问题 这个问题相信大家在实际开发过程当中都有遇见,我自己也遇见过很多次.之前在百度上看见大多数的方法利用的都是键盘唤醒了之后,页面的实际高度会发生变化 ...
- Java 添加条码、二维码到Word文档
本文介绍如何在Word文档中添加条码.二维码.可在文档正文段落中添加,也可在页眉页脚中添加.下面将通过Java代码示例介绍如何实现. 使用工具:Free Spire.Office for Java(免 ...
- Python 字符串改变
在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符. 因此改变一个字符串的元素需要新建一个新的字符串. 常见的修改方法有以下4种. 方法1:将字符串转换成列表后修改值,然后用joi ...
- 深度理解SpringIOC,面试你根本不需要慌!
文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各种学习资料! 深度理解Spring IOC(控制反转) 一.IOC概述 I ...
- Python爬虫学习02--pyinstaller
Python爬虫学习02--打包exe可执行程序 1.上一次做了一个爬虫爬取电子书的Python程序,然后发现可以通过pyinstaller进行打包成exe可执行程序.发现非常简单好用 2.这是上次写 ...
- 从Excel(CSV)文件导入数据到Oracle
步骤: 1.准备数据:在excel中构造出需要的数据2.将excel中的数据另存为文本文件(有制表符分隔的)3.将新保存到文本文件中的数据导入到pl*sql中在pl*sql中选择tools--text ...
- Python Ethical Hacking - WEB PENETRATION TESTING(1)
WHAT IS A WEBSITE Computer with OS and some servers. Apache, MySQL ...etc. Cotains web application. ...