事件循环队列(异步)、宏任务和微任务

1.定义

js是一门单线程执行的编程语言,同一个时间内只能做一件事情,

存在的问题:单线程执行任务队列会有什么问题

当前一个任务非常耗时,后续的任务就不得不一直等待,为了防止某个耗时任务导致程序假死的问题,异步代码由js委托给宿主环境(浏览器)执行,异步代码就是很耗时的代码。

js主线程代码是一行一行执行的,如果同步就一行一行执行,异步给浏览器,执行完,满足条件就交给任务队列进行排队,

异步一般都有回调函数,把回调函数放到任务队列里,主线程执行完,才去执行任务队列里的代码,所以遇到异步,就挂起,先不执行。

所以这里执行结果是 132

以上整体就是事件循环机制(队列) event loop

2.宏任务和微任务

事件循环由宏任务和在执行宏任务期间产生的所有微任务组成,完成当下的宏任务后,会立即执行在此期间入队的微任务

上一个宏任务执行完,才会考虑下一个宏任务

注意:

  • js主线程遇到异步的内容,交给浏览器去等待,不会阻塞主线程

  • 一定是满足条件后的任务,才会被添加到任务队列

1.宏任务

js的整体代码(主代码块)-整个script,setTimeout,setInterval,ajax请求.....都是宏任务

2.微任务

promise.then 和catch , async/await,

微任务是当前宏任务执行完,在下一个宏任务开始之前需要执行的任务

案例1-执行结果

1 定时器2-延时0 3 定时器 4-延时1000 5

猜测:13524?对的

   // event loop
    console.log(1)
    setTimeout(function(){
        console.log(2)
    },0)
    console.log(3)
    setTimeout(function(){
        console.log(4)
    },1000)
    console.log(5)  //13524
 

若为,10,异步定义100,输出为10?为什么,因为先主线程输出10,主线程空才去执行异步里的东西 

let num=10
    setTimeout(function(){
        num=100
    },0)
    console.log(num)    //10

案例2

axios 和 then setTimeout ,

先宏任务,宏任务的里微任务,.then,然后再去执行定时器,

结果:所以就会输出两个,一个是data,一个是延时器

  
  axios({
        url:"http://www.liulongbin.top:3009/api/news"
    })
    .then(res=>{
        console.log(res.data)
    })
​
    setTimeout(()=>{
        console.log("延时器代码")
    },1000)
​

案例3

案例 2 的内容 1 定时器2 promise.then 1000 3

axios放入浏览器-异步,定时器-浏览器-异步,1是主线程-输出,定时器-浏览器,promise微任务-等待,3-主线程-输出,然后去执行promise微任务,然后再去执行任务队列里的异步:0延时的定时器,然后是axios,然后是1秒的延时器

promise不是异步,是微任务,是宏任务完成之后紧接着执行的

所以先同步,然后是微任务,然后才是宏任务,

结果:1 3 1000 2 object 延时器代码

 axios({
        url:"http://www.liulongbin.top:3009/api/news"
    })
    .then(res=>{
        console.log(res.data)
    })

    setTimeout(()=>{
        console.log("延时器代码")
    },1000)

    console.log(1)

    setTimeout(() => {
        console.log(2)
    }, 0);

    const p=new Promise((resolve,reject)=>{
        resolve(1000)
    })
    .then(data=>{
        console.log(data)
    })

    console.log(3)
    // 1  3 promsie-1000  

案例4

100 定时器200 定时器222 promise.then300 400

结果:先是同步的100 400 然后300 200 222

微任务的执行时机要比宏任务早,所以同步完成之后,先是300,才是200和222,

   console.log(100)
    setTimeout(()=>{
        console.log(200)
    })
    setTimeout(()=>{
        console.log(222)
    })
    Promise.resolve().then(()=>{
        console.log(300)
    })
    console.log(400)
​
//100   400   300   200   222

案例5

1 定时器里2 包含promise 和then promise 5.then6 定时器里7 包含promise 和then 9

结果:1 5-虽然在微任务里写着,但是是同步的,所以也先执行 10 然后是微任务 所以是6 2 然后看2的宏任务有没有微任务 所以是3 然后2的第2个微任务 4 7 8 9

主线程的微任务先执行,然后是其他各个宏任务的微任务在执行完当前宏任务后,再执行本宏任务的微任务

1 5 10 6 2 3 4 7 8 9

console.log(1)   //1

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

    new Promise(function(resolve){
    console.log(5)//2
    resolve()
    })
    .then(function(){
    console.log(6)   //4
    })


    setTimeout(function(){
    console.log(7)  //8
    new Promise(function(resolve){
        console.log(8)  //9
        resolve()
    })
    .then(function(){
        console.log(9)  //10
    })
    })

    console.log(10)  //3

JS的循环机制是指如何处理事件循环中的任务。在JS中,事件循环是一种机制,用于处理异步操作和事件处理。循环机制确保任务按照正确的顺序执行,以保证代码的正确性和性能。 在循环机制中,有两种类型的任务:宏任务(macro-task)和微任务(micro-task)。宏任务包括整体代码块、setTimeout、setInterval等,而微任务包括Promise、MutationObserver、process.nextTick等。 当代码执行时,会首先执行当前代码块中的同步任务,然后执行微任务队列中的所有微任务。接下来,会从宏任务队列中选择一个任务执行,直到宏任务队列为空。然后,再次执行所有微任务,以此类推。 事件队列是用来存储待执行的任务的数据结构。每个宏任务微任务都会被添加到事件队列中。当事件循环开始时,会从事件队列中依次取出任务并执行。 需要注意的是,微任务的优先级高于宏任务。也就是说,在执行完当前宏任务后,会立即执行所有微任务,然后再执行下一个宏任务。这样可以确保微任务能够尽早地被执行,避免出现不必要的延迟。 总结一下: - 循环机制确保异步任务按照正确的顺序执行。 - 宏任务包括整体代码块、setTimeout、setInterval等。 - 微任务包括Promise、MutationObserver、process.nextTick等。 - 事件队列用来存储待执行的任务。 - 微任务优先级高于宏任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值