事件轮询

114 阅读1分钟

事件轮询

  • 时间: 从开始执行代码开始执行轮询
  • 规则:
    • => 从 JS 整体代码开始(这是一个宏任务)
    • => 每执行完毕一个宏任务, 就会清空一次微任务队列(不管微任务队列里有多少任务, 都执行完毕)
    • => 再次执行下一个宏任务
    • => 循环往复, 直到所有的任务队列清空结束
  • 关键字:
      1. 单线程: JS 是一个单线程的代码执行机制, 逐行向下执行, 上边的代码执行时间过长会阻塞下边的代码
      1. 调用栈: 用来执行代码的, 所有的代码进栈执行, 执行完毕再出栈 (后进先出)
      1. 队列: 用来存放异步任务的, 先进先出
      • => 宏任务队列: JS 整体代码, setTimeout, setInterval...
      • => 微任务队列: promise.then()...
      1. 轮询: 轮流询问 宏任务 与 微任务队列的任务来执行
      1. 注意: WEBApi, 用来负责提供异步机制, 计时, 分配任务去指定队列
  • 最关键的一句话: 每执行完毕一个宏任务, 会清空一次微任务队列 (前提是你要区分清楚什么是同步任务, 什么是宏任务, 什么是微任务)
    console.log(1);
    setTimeout(() => {
        console.log(2);
    }, 0);
    new Promise((resolve) => {
        console.log(3);
        resolve();
    }).then(() => {
        console.log(4);
    });
    setTimeout(() => {
        console.log(5);
        new Promise((resolve) => {
            console.log(6);
            setTimeout(() => {
                console.log(7);
            });
            resolve();
        }).then(() => {
            console.log(8);
        });
    }, 500);
    new Promise((resolve) => {
        console.log(9);
        resolve();
    }).then(() => {
        console.log(10);
        setTimeout(() => {
            console.log(11);
        }, 0);
    });
    console.log(12);