2012-07-20 89 views
5

我有一些非常奇怪的行为正在进行。我有以下jQuery:JS调试器是否暂停整个JS事件循环?

myElement.fadeOut(100); 

有一些种族情况正在发生,使元素不会最终隐藏。如果我在该行上放置了一个调试器并逐步完成代码,那么它可以正常工作,并且元素会淡出并隐藏起来。称它为Heisenbug

我的问题不在于比赛条件本身。鉴于JavaScript运行时的性质,我想知道如何发生这种情况。按照我的理解如下谓词为真:

  1. 淡出()由JQuery的动画()
  2. 动画()实现是由一系列的setTimeout()电话
  3. setTimeout()调度函数在执行实施某个时间点的队列
  4. 当事件到达队列的开始位置时,将执行该功能。
  5. 只有一个事件循环,按顺序执行。
  6. 在任何给定的时间点,只有一个通过调用堆栈的函数/路径正在执行。

鉴于我正在逐步调试我的调试器中的函数,所以必须暂停执行,并且不能执行其他函数。

我看不出在这种情况下出现竞态条件的可能性。 您能否建议执行的调试代码和非调试代码之间有何不同?

回答

2

您的项目符号是正确的,除了使用requestAnimationFrame()而不是setTimeout()(如果浏览器支持它的话)。

如果例如通过AJAX调用异步创建myElement,但调用​​而不等待请求完成,调试会话可能会影响代码的行为。

在这种情况下,手动逐句通过代码可以给请求返回足够的时间,并且调用​​之前创建的元素,而在正常情况下请求不会返回。

+0

啊,你知道吗,有一个阿贾克斯负载。这可能是... – Joe 2012-07-20 14:08:13

+0

使用成功或完成回调,而不是超时,如果这是怎么回事。总是假设阿贾克斯可能会挂一点点。 – 2012-07-20 14:10:13

+0

我当然没有为此目的使用超时! – Joe 2012-08-15 14:38:02