如何通过警报解决(未定义)时序问题进行调试?

时间:2016-04-04 14:29:07

标签: javascript debugging alert timing

我遇到了一些我无法澄清的Web应用程序行为:添加警报行以实际调试它"解决"因为错误没有发生的问题。故事的相关部分如下:

我有一个init方法,一个显示内容的功能和一个" main"函数,类似于(注意a是全局变量,是命名空间的一部分) PS:事实证明,我的最小例子等同于缺少一些重要的部分,这导致了这个问题。

a = undefined;

init = function() {
     if ( a === undefined ) { a = new A } //global variable 
     alert("1 - a gets defined");
}

//method is part of A when A is constructed
A.show = function() {...}

//PS: the call to init() was part of a content-dependant method where init was skipped altogether when no content was loaded yet.
updateContent = function(){
    if (noDataLoaded()) {return;}
    init(); //PS: Init has been moved before the content check
    performUpdatesAccordingToContent();
}

main() {
    updateContent();
    alert("2 - trying to display a");
    a.show();
}

如果执行如上:显示警报1,然后显示警报2,然后显示获取内容。 如果在没有警报的情况下执行,则会引发以下错误,从而破坏应用程序:

TypeError: a is undefined

在触发文档就绪事件后调用所有函数,据我所知,并添加警报行以检查执行的正确顺序。

问题是如何添加警报线可以解决初始化问题?那么:没有它们怎么解决呢?

1 个答案:

答案 0 :(得分:0)

根据我迄今收集到的内容并感谢@Damon,@ Fat_Freddy和@squint(查看代码路径以获得最小示例的完整性实际上有助于解决部分解决方案),下面是一个总和 - 回答。

使用警报调试代码会在等待用户输入时在主线程中添加大量延迟。这可以为事件队列中的后台工作提供时间来完成,改变窗口的状态(在我的情况下允许正确的初始化)。因此,一般情况下,如果添加警报会更改Web应用程序的行为,则意味着您必须查找可能受到后台事件影响的组件。

如果没有涉及异步调用(ajax)或排队的事件会影响您的应用状态,则警报无法更改Web应用的行为。