1

我正在尝试调试一些 javascript 代码。我要调试的变量是对象的 JS 对象,异步加载(ajax 回调)。我在回调之外调试它。

我很确定这个问题是一个竞争条件问题,但我想确定(这不是我的问题)。

我在调试时发现的问题是,它console.log给了我一个与代码正在做什么没有意义的信息。因此,要么我在代码中遗漏了一些东西,要么我在控制台中看到的结果不是我运行时变量状态的快照console.log

如果结果是后者,我怎样才能获得异步加载的 JS 对象状态的快照


这是代码的简化示例

//This call takes a while to invoke the callback
$.get("url",function(data){
    //Process data
    globalVariable = data; //JSON (Object of objects)
}

//Couple lines afterwards
/* This console.log shows (in Firebug's console) "Object { }" and when I click it,
   I can see the object with all its fields filled (oher objects) 
*/
console.log(globalVariable); 
for(var e in globalVariable){
     //Does not enter here, meaning that the object is empty
}
4

2 回答 2

2

console.log它本身是异步的,有时它会显示引用而不是快照。

如果您记录一个对象,您将获得一个很好的可点击界面,您可以在其中检查该对象。如果对象发生更改,您将看到这些更改反映在那里。

如果您想要一个真实的快照,您将不得不进行一些序列化,并且序列化对象并非易事。如果您的对象只是数据并且没有功能或引用,您可以使用JSON.stringify(obj, undefined "\t").

更聪明的方法是暂停异步事件,以便检查对象的最新状态。

于 2013-11-28T17:07:58.793 回答
0

改为这样写。这样, globalVariable 将在您对其采取行动之前获得数据。

$.get("url",function(data){
    //Process data
    globalVariable = data; //JSON (Object of objects)

    for(var e in globalVariable){
        //this will run
    }
}
于 2014-01-13T20:40:39.720 回答