有谁知道什么可以导致传递到setTimeout(func, 0)
被调用的函数显着延迟?从setTimeout(func, 0)
执行时间和func
实际调用时间之间,我看到延迟超过1.2秒。什么可以导致从setTimeout回调延迟(回调,0)
我只看到这种行为与Chrome v52(v51没有它)。所以,这可能是一个Chrome的问题,但在我报告它是一个错误之前,我想调查它。
我不幸没有一个可以重新使用它的小案例。它发生在AngularJS应用程序中,以响应滚动事件。我们通过鼠标滚轮来处理滚动事件触发器,并且作为其中的一部分,请调用setTimeout(func, 0)
来完成一些后续工作。
使用Chrome devtools,我可以看到在这个1.2秒的差距期间只有很少的JavaScript运行。我没有阻止线程。事实上,我使用console.profile和console.profileEnd来分析特定的1.2秒图像。它显示它在99%的时间里处于闲置状态。
看devtools中的时间线,我在那个时间段内看到的唯一一件事就是处理“Mouse Wheel”事件。他们中的很多人(差距的前1秒每5毫秒一次)。这本身有点奇怪,因为在那段时间鼠标滚轮没有滚动。我做了一个Mac Magic Mouse的虚拟滚轮的轻拂,我们撞到了可滚动区域的顶部。事件发生后,我们不断收到鼠标滚轮事件。
有没有人有任何想法?可以很快执行一小段鼠标滚轮事件来延迟回调的调用吗?有什么方法可以调查为什么超时回调在其调度时间后1.2秒被调用?
编辑:添加了描绘setTimeout显示回调的时间线图像。
你肯定需要一个可复制的例子来报告它的错误,所以请不要犹豫,发布它。 – estus
'setTimeout(func,0)'将函数放在队列中,并调度它以调用下一个事件循环或下一个“记号”,换句话说。由于浏览器仅为UI使用单个线程,因此可能会造成一些问题。鼠标滚轮事件可能是相关的,但我不认为有一个明确的方式来说明没有检查他们在做什么和为什么。 – vlaz
我添加了一个显示时间线的图像。控制台正在记录何时调用'setTimeout'方法以及何时执行回调。在这个例子中,它需要超过1.4秒。摘要图显示我们大多数时间都处于闲置状态。它真的可能是有人在窃取线程吗? – Steven