2013-11-28 3 views
1

Я пытаюсь отладить некоторый код javascript. Переменной, которую я хочу отлаживать, является объект объектов JS, загруженный асинхронно (ajax callback). Я отлаживаю его вне обратного вызова.Консоль Firebug: отладка асинхронных переменных

Я уверен, что проблема связана с проблемой гонки, но я хочу быть уверенным (и это не мой вопрос).

Проблема, которую я нахожу при отладке, заключается в том, что 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 
} 

ответ

2

console.log сам по себе асинхронный и он показывает ссылки, а не снимки, иногда.

Если вы зарегистрируете объект, вы получите приятный интерактивный интерфейс, где вы сможете осмотреть объект. Если объект изменится, вы увидите, что там отражены изменения.

Если вы хотите, чтобы реальный снимок, который вам нужно сделать для сериализации и сериализации, не является тривиальным. Если ваши объекты просто являются данными и не имеют никаких функций или ссылок, вы можете использовать JSON.stringify(obj, undefined "\t").

Более разумный способ - приостановить асинхронные события, чтобы вы могли проверить последнее состояние объекта.

0

Напиши это так. Таким образом, globalVariable будет иметь данные, прежде чем действовать на них.

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

    for(var e in globalVariable){ 
     //this will run 
    } 
} 
Смежные вопросы