使用setTimeout(...,0)的Javascript异步

问题描述 投票:0回答:1

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

每天我主要使用回调,承诺,异步/等待,但最后我只是依赖于已经异步的方法。

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

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

经过我的研究,我可以读到让我的代码异步的一种方法,就是使用qmsxswpoi,延迟时间为0ms(在事件队列中放置一条消息,将在下一次打勾后执行)

setTimeout

我的问题是:

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

以下视频显示了事件循环如何处理0延迟的function longOperation(cb) { setTimeout(function() { var i = 0; while (i != 1000000000) { i++; } cb(); }, 0); } longOperation(() => { console.log('callback finished'); }) console.log('start');

setTimeout

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

javascript node.js v8 event-loop
1个回答
1
投票
  1. 外部代码执行完成。
  2. setTimeout 0计时器立即到期,因此它的回调立即运行并执行完成(长时间运行的JavaScript Event loop with setTimeout 0循环及其回调)。

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.