JavaScript 宏任务与微任务

news/2024/11/14 17:29:16/

一、什么是宏任务和微任务?

首先,我们要先了解下 Js 。js 是一种单线程语言,简单的说就是:只有一条通道,那么在任务多的情况下,就会出现拥挤的情况,这种情况下就产生了 ‘多线程’ ,但是这种“多线程”是通过单线程模仿的,也就是假的。那么就产生了同步任务和异步任务。

二、JS为什么要区分宏任务和微任务?

(1)js是单线程的,但是分同步异步
(2)微任务和宏任务皆为异步任务,它们都属于一个队列
(3)宏任务一般是:script、setTimeout、setInterval、postMessage、MessageChannel、setImmediate(Node.js 环境)
(4)微任务:Promise.then、Object.observe、MutationObserver、process.nextTick(Node.js 环境)
(5)先执行同步再执行异步,异步遇到微任务,先执行微任务,执行完后如果没有微任务,就执行下一个宏任务,如果有微任务,就按顺序一个一个执行微任务

三、宏任务、微任务有哪些?

  • 宏任务一般是:script、setTimeout、setInterval、postMessage、MessageChannel、setImmediate(Node.js 环境)
  • 微任务:Promise.then、Object.observe、MutationObserver、process.nextTick(Node.js 环境)

四、宏任务、微任务是怎么执行的?

执行顺序:先执行同步代码,异步任务放入任务队列中,当所有同步代码执行完毕后,先执行微任务在执行宏任务。

示例

setTimeout(function(){console.log(1);
});
new Promise(function(resolve){		    console.log(2);resolve();
}).then(function(){		    console.log(3);
}).then(function(){console.log(4)
}); 		
console.log(5);
// 2 5 3 4 1

分析

  1. setTimout是异步宏任务,放入宏任务队列中
  2. new Promise在实例化的过程中所执行的代码都是同步进行的,所以输出2
  3. Promise.then是异步微任务,将其放入微任务队列中
  4. 遇到同步任务console.log(5);输出5;主线程中同步任务执行完
  5. 从微任务队列中取出任务到主线程中,输出3、 4,微任务队列为空
  6. 从宏任务队列中取出任务到主线程中,输出1,宏任务队列为空
console.log(1)
setTimeout(function() {console.log(2)
}, 0)
const p = new Promise((resolve, reject) => {resolve(4)
})
p.then(data => {console.log(data)
})
console.log(3)
//1,3,4,2
  • 遇到同步任务console.log(1);输出1;
  • 遇到setTimeout 异步宏任务,放入宏任务队列中;
  • 遇到 Promise,new Promise在实例化的过程中所执行的代码都是同步进行的,但由于new Promise没有输出事件,所以接着执行遇到.then;
  • 执行.then,异步微任务,被分发到微任务Event Queue中;
  • 遇到同步任务console.log(3);输出3;
  • 主线程中同步任务执行完,从微任务队列中取出任务到主线程中,p.then 输出4,微任务执行完毕,任务队列为空;
  • 开始执行宏任务setTimeout 输出2,宏任务队列为空;

http://www.ppmy.cn/news/593527.html

相关文章

Redis慢查询分析

慢查询分析 谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来。 执行一条命令分为如下4个部分…

【Java】时差问题,格林威治时间(GMT)与北京时间转换

格林威治时间加上8h即为北京时间 本文以格林威治时间转为北京时间为例,若需将北京时间转为格林威治时间只需将文中8改为-8即可 1. 时间格式为:2021-01-04T04:16:23.609Z 此处T为分隔符,Z为时区 package org.example;import java.text.Pars…

微软电脑怎么设置时间服务器地址,如何配置Internet时间设置,让电脑时间与北京时间分秒不差...

分秒不差的时间在如今这个时代什么时候最有用呢?呵呵,就是秒杀商品时。之前天猫搞了一个秒杀活动,就因为Microsoft酋长相信了电脑上的时间,结果比准确的北京时间晚了10多秒,错过了时机。而且今天Microsoft酋长之所以写…

关于分行数字化转型工作的几点思考

关于分行数字化转型工作的几点思考 作者:北京银行盛瀚 1、数字化转型到底是什么? 目前不论是从国家战略层面还是地方政府重点工程,乃至企业规划报告,数字化转型是被提及最多的字眼之一,尤其是《“十四五”数字经济发展…

C/C++ 时间知识总结

文章目录 C/C 中时间的概念常用的时间库函数time()asctime()gmtime()ctime()localtime()mktime()strftime()difftime() C/C 获取当前(本地)时间的方法方法一方法二方法三方法四方法五 C/C 中时间的概念 Unix 时间戳(Unix timestamp&#xff…

将UTC时间(2018-07-03T10:18:58.000Z)转换为北京时间

2018-07-03T10:18:58.000Z是什么时间格式 UTC:时间标准时间,世界标准时间 ✅ GMT:格林尼治时间 GST:北京时间 js如何处理UTC时间格式 遇到问题:用了阿里云的接口,发现传的日期是UTC格式的。需要转换。…

mysql显示的是北京时间,现在只取时间或只取日期

一、如图,显示的是北京时间,现在只取时间或只取日期, 用date_format这个函数 1、只取时间 ,DATE_FORMAT(date,format),date 参数是合法的日期,format 规定日期/时间的输出格式。 可以使用的格式有&#xf…

js如何获取计算机当前时间,js获取当前系统时间

var myDate new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-????) myDate.getMonth(); //获取当前月份(0-11,0代表1月) myDate.getDate(); //获取当前日(1-31) myDate.getDay(); //获取当前星期X(0-6,0代表星期天) …