熟悉宏任务和微任务以及js(nodejs)事件循环机制,在写业务代码还是自己写库,或者看源码都是那么重要

看了部分文档,自己总结和实践了一下

js中同步任务、宏任务和微任务介绍

同步任务: 普通任务

宏任务(异步任务,包括各种DOM事件) 来自于h5规范

分类: I/O(网络,文件,数据库I/O) setTimeout setInterval requestAnimationFrame(下次页面重绘前所执行的操作, 浏览器环境才有) setImmediate(nodejs才有)

  1. 宏任务所处的队列:宏任务队列
  2. 第一个宏任务队列只执行一个任务,执行主线程js代码,
  3. 宏任务队列可以有多个任务

微任务(异步任务) 来自于h5规范

分类: new Promise().then(回调)、 process.nextTick()(nodejs才有)

  1. 微任务所处的队列:微任务队列
  2. 只有一个微任务队列
  3. 在上一个宏任务队列执行完毕后,如果有微任务队列就会执行微任务队列中的所有任务;

执行顺序

当主线程js代码(属于宏任务第一队列)执行完毕后,如果有微任务,则优先执行微任务(process.nextTick优先执行),然后才执行宏任务

nodejs事件轮询(循环)机制(宏任务)介绍(借助libuv(c / c++)库实现)

执行顺序:

  1. timer: 定时器阶段 计时和执行到点的回调函数 settimeout
  2. pending callbacks 处理某些系统操作(TCP连接错误等)
  3. idle prepare 准备工作(nodejs才有)
  4. poll 轮询阶段(轮询队列,可以理解为普通异步任务,如网络请求) 先进先出、依次同步取出轮询队列中第一个回调函数执行/知道队列为空 或者 达到系统最大限制

    如果队列为空,并且设置过setImmediate,直接进入下一个check阶段(未设置:停留在当前poll阶段等待,直到队列添加了回调函数)
  5. check阶段,查阶段,执行setImmediate(nodejs才有)
  6. 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的宏任务和微任务的更多相关文章

  1. js为什么是单线程的?10分钟了解js引擎的执行机制

    深入理解JS引擎的执行机制 1.JS为什么是单线程的? 为什么需要异步? 单线程又是如何实现异步的呢? 2.JS中的event loop(1) 3.JS中的event loop(2) 4.说说setT ...

  2. 10分钟理解JS引擎的执行机制

    首先,请牢记2点: (1) JS是单线程语言 (2) JS的Event Loop是JS的执行机制.深入了解JS的执行,就等于深入了解JS里的event loop 1.灵魂三问 (1) JS为什么是单线 ...

  3. 10分钟用JS实现微信 "炸屎"大作战

    大家好,我是秋风,近日,微信又发布了新功能(更新到微信8.0.6).最火热的非"炸屎"功能莫属了,各种群里纷纷玩起了炸屎的功能. 不知道大家是否经历过那样一个时候,小时候(我是说很 ...

  4. 转:10分钟了解JS堆、栈以及事件循环的概念

    https://juejin.im/post/5b1deac06fb9a01e643e2a95?utm_medium=fe&utm_source=weixinqun 前言 其实一开始对栈.堆的 ...

  5. 10分钟学会js处理json常用方法

    一.json定义 JSON ( JavaScript Object Notation) ,它是一串字符串 只不过元素会使用特定的符号标注. {} 双括号表示对象 [] 中括号表示数组 "&q ...

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

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

  7. JavaScript 10分钟入门

    JavaScript 10分钟入门 随着公司内部技术分享(JS进阶)投票的失利,先译一篇不错的JS入门博文,方便不太了解JS的童鞋快速学习和掌握这门神奇的语言. 以下为译文,原文地址:http://w ...

  8. 不用搭环境的10分钟AngularJS指令简易入门01(含例子)

    不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...

  9. 10分钟弄懂javascript数组

    建议阅读时间 : 10分钟 主要内容:javascript数组的基本概念.属性.方法 新建数组: var arr01 = ["a","b","c&qu ...

随机推荐

  1. 洛谷 P3574 [POI2014]FAR-FarmCraft

    题目传送门 题目描述 输入输出格式 输入格式: 输出格式: 一行,包含一个整数,代表题目中所说的最小时间. 输入输出样例 样例输入 样例输出 提示 分析 我们设f[x]为遍历完以x为根的子树且将这棵子 ...

  2. web网页动态分享facebook和twitter

    介绍 facebook分享 http://www.facebook.com/sharer.php?t=${text}u=encodeURIComponent('静态html') twitter分享 h ...

  3. Linux多任务编程之一:任务、进程、线程(转)

    来源:CSDN  作者:王文松  转自:Linux公社 Linux下多任务介绍 首先,先简单的介绍一下什么叫多任务系统?任务.进程.线程分别是什么?它们之间的区别是什么?,从而可以宏观的了解一下这三者 ...

  4. 使用Typora写博客,图片即时上传,无需第三方图床-EasyBlogImageForTypora

    背景 习惯使用markdown的人应该都知道Typora这个神器,它非常简洁高效.虽然博客园的在线markdown编辑器也不错,但毕竟是网页版,每次写东西需要登录系统-进后台-找到文章-编辑-保存草稿 ...

  5. row_number() over()排序功能说明

    1.row_number() over()排序功能: (1) row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排 ...

  6. oracle终止用户会话

    1.创建两个测试用户进行实验 执行命令如下: create user test1 identified by 1; create user test2 identified by 1; grant d ...

  7. android studio 正式版打包错误的一个问题

    今日在下载了别人的demo后,编译到我的手机上,然后通过qq等把软件发到其他的手机上使用时,无法安装,好像是因为这个是调试版本才安装不上,在网搜了一堆资料怎么建key怎么发布正式的版本,问题现在已解决 ...

  8. Cyber Security - Palo Alto Basic Introduction

    Preparation of the Lab Environment: Download and Install Pan-OS from the following website https://d ...

  9. Ethical Hacking - NETWORK PENETRATION TESTING(5)

    Deauthentication Attacks Theory This attack is used to disconnect any device from any network within ...

  10. 可能这是Redis可视化工具最全的横向评测

    1 命令行 不知道大家在日常操作redis时用什么可视化工具呢? 以前总觉得没有什么太好的可视化工具,于是问了一个业内朋友.对方回:你还用可视化工具?直接命令行呀,redis提供了这么多命令,操作起来 ...