vevlins

js 异步 microtask 和 macrotask 的时机问题

  •  
  •   vevlins · Jul 28, 2018 · 1584 views
    This topic created in 2856 days ago, the information mentioned may be changed or developed.
    console.log(1);
    setTimeout(()=>{
        console.log(2);
        setTimeout(() => {
            console.log(4);
        });
        process.nextTick(()=>{
            console.log(3);
        });
    });
    setTimeout(() => {
     console.log(5);
    });
    

    怎么解释这段运行呢?为什么顺序是 534 而不是 345

    2 replies    2018-07-28 13:11:44 +08:00
    noe132
        1
    noe132  
       Jul 28, 2018 via Android   ❤️ 1
    settimeout 是将一个任务 push 进异步队列
    在 V8 中,异步队列每次 eventloop 执行一个任务
    nextTick 是每次 eventloop 的 step 间隔都会执行,所以 nextTick 会在 settimeout 之前执行。
    所以顺序是 12534
    noe132
        2
    noe132  
       Jul 28, 2018 via Android
    nextTick 不像异步队列一次只执行一个,nextTick 队列是一次完全执行完。所以不能再 nextTick 的回调再 nextTick,这样就会死循环阻塞 eventloop
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2470 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 01:08 · PVG 09:08 · LAX 18:08 · JFK 21:08
    ♥ Do have faith in what you're doing.