如何使用警报进行调试来解决(未定义的)时间问题
How can debugging with alert solve (undefined) timing issue?
我在一个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应用程序的行为。
相关文章:
- 如何消除代码中的未定义和其他问题
- 组件生命周期问题/无法处理未定义的问题
- JavaScript/jQuery JSON数组问题-值为未定义
- 使用Breeze脱机数据时出现未定义的问题不是函数
- 如何使用警报进行调试来解决(未定义的)时间问题
- SJCL的问题“;无法读取属性'替换'“未定义”;
- JSON JavaScript 未定义的变量问题
- 创建可在任何地方使用的 JS 函数?范围和功能“未定义”的问题
- 将 AJAX 传递给 PHP 时遇到问题,而是未定义
- 尝试添加到根父节点时出现 KendoUI 未定义节点问题
- 榆树早午餐编译问题:“拆分”未定义
- JavaScript,jquery中未定义的VAR的问题.如何
- JS Revearing Pattern事件未定义问题
- 未捕获引用错误:未定义问题
- Javascript未定义问题
- IE8中控制台未定义问题
- JavaScript全局变量未定义问题
- 对象未定义问题
- 使用Google' Javascript API的未定义问题
- JS对象未定义问题