美文网首页
步遥——事件循环队列

步遥——事件循环队列

作者: 你还想好吗 | 来源:发表于2020-12-06 11:16 被阅读0次

       js由于处理浏览器事件的原因,所以它是一个单线程的处理机制。但是为了提高cpu的利用率,js在主线程之外,会把一些计算的任务分配给子任务。事件循环就是js处理多任务同时进行的一种机制。

       js维护着一个调用栈,一个消息队列,一个微任务队列 ,其中调用栈中是同步任务代码,当执行过程中,遇到了同步任务,就压入调用栈中,并立即执行该任务,执行完毕之后,就把该执行环境销毁。当遇到一个异步任务,会根据是宏任务还是微任务,将该任务中的回调压入到对应的队列中。比如setTimeout,setInterval,setImmediate,I/O,UI rendering,等都是宏任务,遇到这些任务,会将这些方法中的回调中的处理任务(回调函数内部的代码)压入到消息队列中,而如果遇到了promise,process.nextTick,这样的微任务,就会把这些函数的回调函数放入到微任务队列中(new promise中的参数是同步任务,只有.then中的才是异步任务)。

       当调用栈中的代码执行完毕之后,就会先去检查微任务队列,如果微任务队列中有任务,就将微任务队列中待执行的全部任务依次压入调用栈中执行,直到微任务队列中的代码被执行完毕,然后去检查宏任务队列,再将宏任务队列中的第一个任务压入到调用栈中进行执行,执行完第一个宏任务之后,再去检查调用栈中是否有未执行的代码,优先执行调用栈中的代码,执行完毕之后再优先检查微任务队列,依次执行完所有的微任务队列中的代码后再去检查宏任务队列,还是只取出宏任务队列中的第一个任务执行,执行完毕之后,再去检查执行栈中是否有待执行任务,然后是微任务队列,最后再是宏任务队列,依次无限循环下去。。。

        举个例子:

var p = new Promise(resolve => {

    console.log(4);//同步先执行

    resolve(5)

    })

    function fun1(){

    console.log(1)

    }

    function fun2(){

    setTimeout(()=>{

    console.log(2)

    });

    fun1();

    console.log(3);

    p.then(resolved=>{

    console.log(resolved)

    }).then(()=>{

    console.log(6)

    })

    }

setTimeout(() => {

    console.log(7)//宏任务先压入宏任务队列

}, 0);

    fun2()//执行func2时又压入一个宏任务和2个微任务

    fun1()//同步任务,要优于以上两个宏任务和微任务,但是2个微任务的执行优先级高于2个宏任务

输出:

4

1

3

1

5

6

7

2

        这就是js中的事件循环机制。了解了该循环处理事件的机制,就能很好的遇见代码的执行顺序,并再出现问题时根据执行的顺序定位对应的问题点。

相关文章

  • 步遥——事件循环队列

    js由于处理浏览器事件的原因,所以它是一个单线程的处理机制。但是为了提高cpu的利用率,js在主线程之外,会...

  • tips

    // 1. 对于事件循环的每个阶段(定时器队列,I/O 事件队列,immediates 队列,close 处理队列...

  • 成长(10/2000)——面试题合集7

    事件循环机制event-loop 事件循环机制由三部分组成:调用栈、消息队列和微任务队列。 event-loop开...

  • 20211021

    1、js里的事件循环机制(event loop)答:js事件循环中有异步队列有两种:宏任务队列(macro)和微任...

  • vue-Event Loop事件循环队列 ,$nextTick

    vue--Event Loop事件循环队列 ,$nextTick ,队列 , 异步的关系 数据更改==>不会立即...

  • 事件驱动,IO多路复用

    事件驱动 有一个事件(消息)队列; 鼠标按下时,往这个队列中增加一个点击事件(消息); 有个循环,不断从队列取出事...

  • js笔记

    Javascript 事件循环: js解析方法时,将同步任务排队到执行栈中,异步任务排队到事件队列中。 事件队列分...

  • Dart 异步处理之Future

    Dart的事件循环遵循以下规则: 先处理所有微任务队列的微任务 再处理事件队列里事件 Future Api Tim...

  • 3,promise async/await settimeo

    这题主要考察的是这三者在事件循环中的区别,事件循环中分为宏任务队列和微任务队列。 其中setTimeout的回调函...

  • 知识点

    ...语法 反转 Event Loop(事件循环) 主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个...

网友评论

      本文标题:步遥——事件循环队列

      本文链接:https://www.haomeiwen.com/subject/rrlowktx.html