繁体   English   中英

Javascript与setTimeout(…,0)异步

[英]Javascript Asynchronous with setTimeout(…, 0)

我想更好地了解事件循环和异步代码在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

setTimeout为0的JavaScript事件循环

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM