Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有0秒延迟的setTimeout完全更改结果-为什么?_Javascript_Asp.net_Twitter Bootstrap_Knockout.js - Fatal编程技术网

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

Javascript 具有0秒延迟的setTimeout完全更改结果-为什么?,javascript,asp.net,twitter-bootstrap,knockout.js,Javascript,Asp.net,Twitter Bootstrap,Knockout.js,我有一个.aspx页面,我正在使用第三方javascript编辑器-CodeMirror。切换选项卡时,当我离开编辑器选项卡并返回它时,编辑器的内容不会刷新。这是CodeMirror的一个已知问题,人们使用专用的刷新功能来处理它。在我的解决方案中,我通过敲除的数据绑定在引导过程中调用它。问题是,它本身不起作用,所以人们所做的是添加一个“延迟”: 。。。然后它就起作用了。1毫秒甚至无关紧要,因为我可以给它0毫秒的延迟,它仍然可以工作。如果我删除setTimeout函数,CodeMirror会突然不

我有一个.aspx页面,我正在使用第三方javascript编辑器-CodeMirror。切换选项卡时,当我离开编辑器选项卡并返回它时,编辑器的内容不会刷新。这是CodeMirror的一个已知问题,人们使用专用的刷新功能来处理它。在我的解决方案中,我通过敲除的数据绑定在引导过程中调用它。问题是,它本身不起作用,所以人们所做的是添加一个“延迟”:

。。。然后它就起作用了。1毫秒甚至无关紧要,因为我可以给它0毫秒的延迟,它仍然可以工作。如果我删除setTimeout函数,CodeMirror会突然不刷新(可能是因为与应用程序的当前状态相对应而尝试过早刷新)

假设延迟被声明为0毫秒

1) 这到底是怎么回事?我的理解是否正确,浏览器偶然发现了setTimeout函数,通常会将其从执行队列中取出,然后等待最接近的可能窗口至少0毫秒。实际上,这会引入延迟。是这样吗?还是有其他原因让这一切顺利

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

3) 我是否可以计算或扣除任何确定性最小延迟?我是否可以确信延迟至少为X ms


总的来说,我没有信心提出一个似乎不确定的解决方案。目前,它似乎正在运行,因为它引入了“一些/任何”延迟。有人能对此做更多的解释吗?

浏览器在一个线程中运行JavaScript UI代码,您必须了解异步如何在JavaScript中工作
setTimeout
具有异步回调功能。
setTimeout
使函数被抛出到队列中,并且仅当堆栈上当前的所有命令都将完成时才调用该函数

例如:

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

据我所知,
setTimeout
,无论设置了多长时间,都会中断脚本运行的线程,释放资源,从而允许完成重画。因此,时间本身对于获得所需的刷新效果几乎不重要。不过,如果需要精确的时间,这种解释可能会有所帮助► <代码>JavaScript是单线程的浏览器在单线程中运行UI代码。JS可以在多个线程中运行,一般来说,只是大多数情况下它不能运行。@vlaz是的,它可以在多个线程上运行,也可以在多台计算机上运行,但它必须在单独的上下文中运行。顺便说一句,大多数浏览器上的JavaScript大多在多个线程上运行,每个选项卡和浏览器窗口至少运行一个线程,然后是扩展和工作线程,等等。
setTimeout(function () {
   console.log('setTimeout');
}, 0);
for(let i = 0; i<=2; i++){
   console.log('loop');
}
work
work
work
setTimeout