首页 > 其他分享 >事件队列(EventLoop)【宏任务,微任务】

事件队列(EventLoop)【宏任务,微任务】

时间:2023-06-13 14:45:27浏览次数:29  
标签:function console log EventLoop 任务 Promise 执行 事件队列

一、概念

event:事件

loop:循环,循环的是一个又一个的任务队列

任务队列:是一个先进先出的数据结构,排在前面的事件,优先被主线程读取

任务队列分为:宏队列,微队列,分别存放宏任务和微任务

二、宏任务【多个】、微任务【1个】

微任务一般比宏任务先执行,并且微任务队列只有一个,宏任务队列可能有多个

我们常见的点击和键盘等事件也属于宏任务

1、常见宏任务

  • setTimeout()
  • setInterval()
  • setImmediate()
  • script全部代码

2、常见微任务

  • promise.then()
  • promise.catch()
  • new MutaionObserver()
  • process.nextTick()

3、本质区别

(1)宏任务特征:有明确的异步任务需要执行和回调;需要其他异步线程支持。

(2)微任务特征:没有明确的异步任务需要执行,只有回调;不需要其他异步线程支持。

4、执行顺序【这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)】

console.log  =  promise  >  promise.nextTick  >  promise.then  >  setTimeout  >  setImmediate

(1)先按代码顺序将同步任务压入主执行栈中执行

(2)遇到异步任务则先将异步任务压入对应的任务队列中(宏队列或微队列)

(3)同步任务执行完毕后,查看微队列,将微任务一一取出进入主执行栈中执行

(4)微任务队列清空后,再查看宏队列,只取出第一个宏任务执行,执行完一个宏任务后,回到第三步的操作

          

【then中的回调函数要确定Promise状态后才能压入微队列】

// Promise中的执行顺序
 
let promise = new Promise(function(resolve, reject) {
    console.log('Promise');
    resolve();
});
 
promise.then(function() {
    console.log('resolved');
});
 
console.log('Hi!');//Promise//Hi! //resolved
//执行顺序
setTimeout(function () { console.log(1); }); new Promise(function(resolve,reject){ console.log(2) resolve(3); }).then(function(val){ console.log(val); new Promise((resolve, reject) => { console.log(5) resolve(7) }).then(res => { console.log(res); }) }) console.log(4); //先按顺序执行同步任务, //Promise新建后立即执行输出2,接着输出4,异步任务等同步任务执行完后执行, //且同一次事件循环中,微任务永远在宏任务之前执行。这时候执行栈空了,执行事件队列, // 先取出微任务,输出3,最后取出一个宏任务,输出1。

练习:

console.log('1主线程');                    //整体script作为第一个宏任务进入主线程
setTimeout(function() {                //setTimeout,其回调函数被分发到宏任务Event Queue(执行规则:从上到下排序,先进先执行)中
    console.log('2宏任务');
    process.nextTick(function() {
        console.log('3宏任务里面的微任务');
    })
    new Promise(function(resolve) {
        console.log('4微任务');
        resolve();
    }).then(function() {
        console.log('5微任务')
    })
})
process.nextTick(function() {    //process.nextTick()其回调函数被分发到微任务Event Queue中
    console.log('6微任务');
})
new Promise(function(resolve) {        //Promise,new Promise直接执行,输出7
    console.log('7微任务');
    resolve();
}).then(function() {
    console.log('8微任务')            //then被分发到微任务Event Queue中,排在process.nextTick微任务后面。
})
setTimeout(function() {            //setTimeout,其回调函数被分发到宏任务Event Queue中,排在前面的setTimeout后面
    console.log('9宏任务');
    process.nextTick(function() {
        console.log('10宏任务里面的微任务');
    })
    new Promise(function(resolve) {
        console.log('11微任务');
        resolve();
    }).then(function() {
        console.log('12微任务')
    })
})
 
//执行结果: 1主线程、7微任务、6微任务、8微任务、2宏任务、4微任务、3宏任务里面的微任务、5微任务、
//          9宏任务、11微任务、10宏任务里面的微任务、12微任务
// 先执行微任务、再执行宏任务

 

标签:function,console,log,EventLoop,任务,Promise,执行,事件队列
From: https://www.cnblogs.com/le-fang/p/17477442.html

相关文章

  • CH32--裸机系统实现多任务
    在ram和flash资源足够的芯片中,我们通常通过跑操作系统来实现多任务,但此方法有个弊端,那就是对ram要求高,那么对于比如003这种只有2K ram的小容量芯片可能就不太够用了。这时就需要裸机来实现多任务了,方法如下:在裸机中,通常都是在一个while循环中,通过判断相应的标志位,来按照顺序......
  • openEuler 计划任务
    计划任务-at命令#创建at任务atnow+3minat>echo"123">>/tmp/at.logat>echo"abc">>/tmp/at.logat>date>>/tmp/at.logctrl+d at22:00at>pwd>>/tmp/getdir.logat>date>>/tmp/getdir.logctr......
  • XXL-JOB手工执行任务报错:msg:xxl-rpc remoting error(Connection refused (Connection
    【问题描述】XXL-JOB手工执行任务报错:msg:xxl-rpcremotingerror(Connectionrefused(Connectionrefused)),forurl  【原因分析】 在xxl-job服务端所在的服务器上面去telnetxxl-job所在的客户端服务器的9986端口,提示拒绝连接:对于端口拒绝连接的问题,应该是网络的问......
  • leangoo领歌Scrum敏捷工具中,如何快速查看项目内所有任务卡片
    ​项目管理员能不能快捷的查看整个项目内的所有任务?能不能快捷查看项目内某一个成员的所有任务?能不能快捷的在项目内通过一些条件选择查看任务?可以导出项目内某一个人的所有任务吗?方便做一些统计等等...这些现在Leangoo领歌敏捷管理工具中都可以实现啦~查看项目内所有任务进......
  • SpringBoot自带ThreadPoolTaskScheduler实现数据库管理定时任务
    最近做了一个需求:将定时任务保存到数据库中,并在页面上实现定时任务的开关,以及更新定时任务时间后重新创建定时任务。于是想到了SpringBoot中自带的ThreadPoolTaskScheduler。在SpringBoot中提供的ThreadPoolTaskScheduler这个类,该类提供了一个schedule(Runnabletask,Triggert......
  • 5分钟搞定,实现 定时任务 的五种方案!
    我们在实际开发中,多多少少都会用到定时任务来处理一些问题。比如金融项目中的对账,每天定时对昨天的账务进行核对,每个月初对上个月的账务进行核对等。还比如,我们需要处理一些老数据迁移,修复一些新项目和老项目数据不兼容的问题等等。常规实现方案方案1:Timer这个目前在项目中用得较少......
  • python定时任务
      无论哪种编程语言,时间肯定都是非常重要的部分,今天来看一下python如何来处理时间和python定时任务,注意咯:本篇所讲是python3版本的实现,在python2版本中的实现略有不同,有时间会再写一篇以便大家区分。1.计算明天和昨天的日期#!/usr/bin/envpython#coding=utf-8#获取今天、......
  • Win10任务栏右下角日期时间秒数 星期几显示设置
    步骤1:点击跳转步骤2:点击跳转Tips:记得关闭小任务栏模式否则日期和周几都不会显示......
  • Golang 定时任务 github/robfig/cron/v3
    robfig/cron/v3 是一个Golang的定时任务库,支持cron表达式。低耦合高内聚,其中涉及装饰器模式,并发处理等。packagemainimport"github.com/robfig/cron/v3"c:=cron.New()//添加一个任务,每30分钟执行一次c.AddFunc("30****",func(){fmt.Println("Everyho......
  • 使用Python完美管理和调度你的多个任务
    本文要点:扩展库schedule的用法。安装方法:pipinstallschedule演示代码:运行效果:......