具有0秒延迟的setTimeout完全改变结果 - 为什么?

时间:2016-12-08 16:51:53

标签: javascript asp.net twitter-bootstrap knockout.js

我有一个 .aspx 页面,我使用的是第三方javascript编辑器 - CodeMirror 。在切换选项卡时,当我离开编辑器选项卡并返回时 - 编辑器的内容不会刷新。这是CodeMirror的一个已知问题,人们使用专用的Refresh函数来处理它。在我的解决方案中,我通过 Knockout 数据绑定在 Bootstrap 标签切换期间调用它。问题在于,它本身并不起作用,所以人们所做的就是添加一个延迟":

setTimeout(function () {
   editor.refresh();
}, 1);

......然后才行。 1毫秒甚至不重要,因为我可以给它一个0毫秒的延迟,它仍然可以工作。如果我删除了setTimeout函数 - 突然CodeMirror没有刷新(可能会尝试刷新太早,并且与应用程序的当前状态相对应)。

因此,我们假设延迟被宣布为0毫秒。

1)这里到底发生了什么?我正确理解,浏览器偶然发现了setTimeout函数,并且通常会将其从执行队列中取出然后等待的最近可能窗口至少 0 ms。在实践中,这引入了延迟。是对的吗?或者是否有其他东西使这项工作?

2)理论上它可能不起作用吗?我的意思是,我会理解在某些环境中,延迟可能太小而无法正常工作,对吗?另外,实际上是否有可能在ASP.NET / knockockout场景中,可能没有引入延迟?

3)我能以某种方式计算或扣除任何确定性的最小延迟吗?我能否确信延迟至少为X ms?

一般来说,我没有信心提出一个看起来如此不确定的解决方案。目前看来它有点像是在工作,因为它引入了一些/任何"延迟。有人能够对此有所了解吗?

1 个答案:

答案 0 :(得分:0)

浏览器在单个线程中运行JavaScript代码,您必须了解异步在JavaScript中的工作方式。 setTimeout具有异步回调函数。 setTimeout使函数被抛入队列,只有在当前堆栈中的所有命令都完成时才会被调用。

例如:

setTimeout(function () {
   console.log('setTimeout');
}, 0);
for(let i = 0; i<=2; i++){
   console.log('loop');
}

在控制台中显示:

work
work
work
setTimeout

enter image description here