2012-02-06 3 views
0

У меня есть следующий код, в котором я хочу, чтобы сохранить содержимое файла bar.txt в переменной foo:переменная JQuery становится неопределенным без причины

var foo; 

jQuery.get('http://example.com/bar.txt', function(data) { 
    foo = data; 
    alert(foo); 
});   

alert(foo); 

Проблема заключается в том, что, по-видимому, после того, как функции JQuery конец переменной становится неопределенной (хотя она была объявлена ​​вне той области). Первый alert(foo) отображает содержимое файла правильно, но второй ничего не отображает.

Может ли кто-нибудь сказать мне, что здесь происходит?

ответ

7

Это как асинхронное программирование работы. Функция $.get «заканчивается», когда вызов обработчика обратного вызова вызывается не линейным способом, следуя коду.

«Первый» alert(), который будет запускаться при запуске этого кода, является тем, который вы вызывали в последней строке (за пределами $.get обработчиком), к тому времени запрос ajax еще не завершен.

Второй alert произойдет, когда ajax будет завершен (внутри обработчика $.get) и отобразит данные, которые вы назначили переменной, исходя из аргумента обработчика.

Некоторые комментарии к вашему коду, надеюсь, вы поймете лучше:

var foo; // foo is now undefined 

jQuery.get('http://example.com/bar.txt', function(data) { 
    // the code in this handler will be executed after the ajax is complete 
    foo = data; 
    alert(foo); // foo is now the contents of bar.txt, this will happen last 
});   

alert(foo); // foo is still undefined, and this alert happens first 

Вы можете запрограммировать это по-другому, если вам нужен пример того, как «повторно» переменную Foo:

var foo; 

jQuery.get('http://example.com/bar.txt', function(data) { 
    foo = data; 
    onData(); 
});   

function onData() { 
    alert(foo); 
} 
+0

Хорошо, но тогда как я могу сохранить данные, которые я получаю внутри обработчика '$ .get', в переменной, которая находится снаружи? – federicot

+0

Вы не можете «сохранить» его позже, если только вы не выполняете синхронный вызов, который не рекомендуется. Обратный вызов - это место, где вы «продолжаете» свой текущий код. Вы могли бы также получить голову вокруг асинхронного программирования сейчас, потому что вы будете использовать его много позже :) – David

+0

Да, я думаю, я понял, это очень неудобно, хотя я привык к «линейному» программированию. Я помещаю весь код (который управляет содержимым текстового файла) внутри $ .get, и это сработало! так спасибо человеку – federicot

2

попробовать

var foo; 

jQuery.get('http://example.com/bar.txt', function(data) { 
    window.foo = data; 
    alert(foo); 
});   

alert(foo); 
+0

Не повезло:/по-прежнему возвращает «undefined» – federicot