• Event Loop事件循环


    1.首先要知道 JavaScript 的运行机制。文字太多请移步--

    2.正是因为 JavaScript 的单线程,事件执行需要排队和循环执行。(同步任务,异步任务(宏任务(macroTask)和微任务(microTask)))

    3.什么是事件循环(event loop)

    为了协调事件(event)、用户交互(user interaction)、脚本(script)、渲染(rendering)、网络(netWork)、用户代理(user agent)的工作而产生的一个机制。

    4.node和浏览器的event loop

    其实网上讲的都不少,但没有概括性,绕来绕去的很难理解,下面是我的概括和理解有错误请大佬一定帮我指出,感谢^v^

    两个在执行宏任务队列(任务中没有微任务前提下)和微任务队列时结果一致,步骤如下:

    ster1:同步任务

    step2:微任务

    step3:宏任务

    两个在执行宏任务队列(有微任务)时结果才不同,步骤如下:

    node:在step3大前提下则有 循环执行所有宏任务遇到微任务加入到微任务队列,宏任务循环执行结束后执行微任务(此时的微任务是宏任务中的与上面step2中微任务不搭嘎)即宏任务先执行。

    浏览器:在step2执行完后取一个宏任务压入到执行栈结束后再取一个宏任务如此循环。

    我理解两个的区别并不是微任务先执行还是宏任务先执行,网上这么讲的太有误导性了。如果还不理解请继续看下面代码示例,毕竟绝知此事要躬行^v^。

    1.node event loop

    • timers: 这个阶段执行定时器队列中的回调如 setTimeout() 和 setInterval()

    • I/O callbacks: 这个阶段执行几乎所有的回调。但是不包括close事件,定时器和setImmediate()的回调。

    • idle, prepare: 这个阶段仅在内部使用,可以不必理会。

    • poll: 等待新的I/O事件,node在一些特殊情况下会阻塞在这里。

    • check: setImmediate()的回调会在这个阶段执行。

    • close callbacks: 例如socket.on('close', ...)这种close事件的回调。

     event loop的每一次循环都需要依次经过上述的阶段。 每个阶段都有自己的callback队列,每当进入某个阶段,都会从所属的队列中取出callback来执行,当队列为空或者被执行callback的数量达到系统的最大数量时,进入下一阶段。这六个阶段都执行完毕称为一轮循环。

    2.MicroTask队列与MacroTask(中没有microTask)队列
     1 console.log("start")
     2 setTimeout(function () {
     3     console.log("setTimeout")
     4 });
     5 console.log("1")
     6 process.nextTick(() => {    //浏览器不支持
     7     console.log("nextTick")
     8 });
     9 new Promise(function (resolve,rejected) {
    10     console.log("promise")
    11     resolve()
    12 }).then(res => {
    13     console.log("promiseThen")
    14 });
    15 setImmediate(function () {
    // 只有 ie10 支持 其他浏览器不支持 16 console.log("setImmediate") 17 }) 18 console.log("The end")
    node: start
        1
        promise
        The end
        nextTick
        promiseThen
        setTimeout
        setImmediate
    chrom: start
        1
        promise
        The end
        promiseThen
        undefined(执行结束)
        setTimeout 
     

    3.宏任务(有microTask)中执行顺序 
     1 setTimeout(() => { 
     2     console.log('timer_1')
     3     Promise.resolve().then(function() {
     4         console.log('promise1')
     5     })
     6 });
     7 setTimeout(() => {
     8     console.log('timer_2')
     9     Promise.resolve().then(function() {
    10         console.log('promise2')
    11     })
    12 });
    node: timer_1
          timer_2
          promise1
          promise2
    chrom:timer_1
          promise1
          timer_2
          promise2

     更新中…………

  • 相关阅读:
    Leetcode 118:Pascal's Triangle 杨辉三角
    Leetcode 498:对角线遍历Diagonal Traverse(python3、java)
    Leetcode加一 (java、python3)
    Leetcode747至少是其他数字两倍的最大数
    python之爬虫(爬取.ts文件并将其合并为.MP4文件——以及一些异常的注意事项)
    杭电oj1717——小数化分数(java实现)
    杭电oj_1713——相遇周期(java实现)
    杭电oj1995——汉诺塔V(java实现)
    杭电oj 2098——分拆素数和(包含如何判断质数及优化),java实现
    杭电oj————2057(java)
  • 原文地址:https://www.cnblogs.com/dopocheng/p/13895958.html
Copyright © 2020-2023  润新知