如何使用警报进行调试来解决(未定义的)时间问题

How can debugging with alert solve (undefined) timing issue?

本文关键字:未定义 问题 时间 解决 何使用 调试      更新时间:2023-12-06

我在一个web应用程序中遇到了一些无法澄清的行为:添加警报行对其进行调试实际上"解决"了问题,因为错误不会发生。故事的相关部分如下:

我有一个init方法,一个显示内容的函数和一个"main"函数,类似于(注意a是全局变量,是命名空间的一部分)附言:事实证明,我的最小示例等价物缺少了一些关键部分,这就是问题的原因。

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,然后显示get的内容。如果在没有警报的情况下执行,则会引发以下错误,破坏应用程序:

TypeError: a is undefined

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

那么,问题是添加警报行如何解决初始化问题?那么:没有他们怎么解决?

基于我迄今为止收集到的内容,感谢@Damon、@Fat_Reddy和@scrimp(查看代码路径以确保最小示例的完整性实际上有助于找出部分解决方案),下面是一个总结答案。

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

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