我有一些非常奇怪的行为。我有以下JQuery:
myElement.fadeOut(100);
存在某种竞争条件,因此该元素最终不会被隐藏。如果我在该行上放置一个调试器并逐步执行代码,它就可以正常运行并且元素会淡出并隐藏起来。称之为Heisenbug。
我的问题不是竞争条件本身 。鉴于JavaScript运行时的性质,我想知道如何实现这一点。根据我的理解,以下谓词是正确的:
setTimeout()
来电setTimeout()
计划在某个时间点在队列中执行函数鉴于我在调试器中单步调试函数,必须暂停执行,并且不能执行其他函数。
我看不出在这种情况下如何出现竞争条件。 您能否建议在已调试和未调试的代码之间执行的可能性如何?
答案 0 :(得分:2)
您的要点是正确的,但如果浏览器支持requestAnimationFrame(),则使用{{3}}代替setTimeout()
。
例如,如果通过AJAX调用异步创建myElement
,但调用fadeOut()
而不等待请求完成,则调试会话会对代码的行为产生影响。< / p>
在这种情况下,手动单步执行代码可以为返回请求提供足够的时间,并且在调用fadeOut()
之前创建元素,而在正常情况下请求不会返回。 / p>