V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vevlins
V2EX  ›  前端开发

js 异步 microtask 和 macrotask 的时机问题

  •  
  •   vevlins · 2018-07-28 13:02:13 +08:00 · 1154 次点击
    这是一个创建于 2123 天前的主题,其中的信息可能已经有所发展或是发生改变。
    console.log(1);
    setTimeout(()=>{
        console.log(2);
        setTimeout(() => {
            console.log(4);
        });
        process.nextTick(()=>{
            console.log(3);
        });
    });
    setTimeout(() => {
     console.log(5);
    });
    

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

    2 条回复    2018-07-28 13:11:44 +08:00
    noe132
        1
    noe132  
       2018-07-28 13:10:22 +08:00 via Android   ❤️ 1
    settimeout 是将一个任务 push 进异步队列
    在 V8 中,异步队列每次 eventloop 执行一个任务
    nextTick 是每次 eventloop 的 step 间隔都会执行,所以 nextTick 会在 settimeout 之前执行。
    所以顺序是 12534
    noe132
        2
    noe132  
       2018-07-28 13:11:44 +08:00 via Android
    nextTick 不像异步队列一次只执行一个,nextTick 队列是一次完全执行完。所以不能再 nextTick 的回调再 nextTick,这样就会死循环阻塞 eventloop
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5401 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:31 · PVG 10:31 · LAX 19:31 · JFK 22:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.