Javascript与setTimeout(...,0)异步

时间:2019-03-31 21:57:54

标签: javascript node.js v8 event-loop

我想更好地了解事件循环和异步代码如何在Javascript中工作。在线上有大量资源,但我找不到我的问题的答案

每天我通常都使用回调,promise,异步/唤醒,但最后,我只是依靠已经异步的方法。

因此,我想知道它是如何工作的,从头开始创建一个异步函数,并处理阻塞代码(或者我应该说慢速代码,它不是HttpRequest或已经提供给我们的任何东西)。

例如,以非常高的条件进行while循环来停止它,应该花一秒钟来完成。这就是我决定为测试实现的。

研究之后,我可以读到使代码异步的一种方法是使用setTimeout,延迟为0ms(将消息放入事件队列,该消息将在下一个滴答之后执行)

function longOperation(cb) {
    setTimeout(function() {
        var i = 0;
        while (i != 1000000000) { i++; }
        cb();
    }, 0);
}

longOperation(() => {
    console.log('callback finished');
})

console.log('start');

我的问题是:

当我的代码最终要执行时,为什么它不再阻塞了?正常执行它与放置事件循环将其推送到调用堆栈的消息之间有什么区别?

以下视频显示了事件循环如何处理延迟为0的setTimeout

JavaScript Event loop with setTimeout 0

但是,执行的代码是一个简单的控制台日志。在我的示例中,这是一个“长”操作...

1 个答案:

答案 0 :(得分:1)

  1. 外部代码执行完毕。
  2. setTimeout 0计时器立即到期,因此其回调立即运行并执行到完成(长时间运行的while循环及其回调)。

在这两个代码执行阶段中,将不会运行其他JavaScript用户代码。