Javascript 萤火虫';s console.log:调试异步变量

Javascript 萤火虫';s console.log:调试异步变量,javascript,asynchronous,firebug,console.log,Javascript,Asynchronous,Firebug,Console.log,我正在调试一些javascript代码。我要调试的变量是一个对象的JS对象,异步加载(ajax回调)。我正在回调之外调试它 我很确定这是一个竞赛条件问题,但我想确定(这不是我的问题) 我在调试时发现的问题是,console.log给我的信息与代码所做的事情无关。因此,要么我在代码中遗漏了什么,要么我在控制台中看到的结果是,当我运行console.log时,它不是变量状态的快照 如果结果是后者,如何获取异步加载的JS对象状态的快照 这是代码的简化示例: //This call takes a w

我正在调试一些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
}

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

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

如果你想要一个真正的快照,你必须做一些序列化,序列化对象并不是件小事。如果对象只是数据,没有函数或引用,则可以使用
JSON.stringify(obj,undefined“\t”)


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

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

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

    for(var e in globalVariable){
        //this will run
    }
}