Цванхарен хорошо ответил на вопрос, но DCrawmer все еще не понял этого. Позвольте мне попытаться уточнить его. Я упрощаю некоторые из них и сглаживаю некоторые детали.
Посмотрите на код, показанный ниже. Это в значительной степени тот же код, что и у tsvanharen, за исключением того, что я заменил анонимную функцию для обратного вызова на фактический указатель функции, и немного более явный, чтобы вы могли видеть, что происходит:
var x = null;
function myCallback(data)
{
alert("Data Loaded:" + data);
}
$.get("test.php", myCallback);
// the rest of your code
alert("The value of X is: " + x);
Предполагая, что test.php требуется даже одна или две загрузки, обратите внимание на порядок появления предупреждений:
1. "The value of X is"
2. "Data Loaded"
Функция $.get()
запускается мгновенно. JavaScript движется и запускает остальную часть вашего кода прямо сейчас. В фоновом режиме он получает вашу страницу в test.php. jQuery скрывает некоторые грязные детали этого.
Функция обратного вызова (второй аргумент $.get()
) запускается позже ( асинхронно ). Или, иначе говоря, функция myCallback
является обработчиком события. Это событие «$.get()
завершил извлечение данных». До этого момента дело не дойдет. Он не работает, когда $.get()
работает! $.get()
просто запоминает, где эта функция на потом.
Функция myCallback
может запускаться через миллисекунды или минуты, намного позже, чем была обработана $.get()
.
Если myCallback
не запускается до нескольких минут спустя, то каково значение x при запуске кода «Значение X»? Это все еще null
. Вот ваш баг .
Чтобы использовать данные, полученные со страницы в вашем скрипте, вы должны сделать что-то вроде этого:
- Запустите ваш скрипт, объявите переменную для хранения данных.
- Вызов
$.get()
, с функцией обратного вызова для обработки возврата.
Больше ничего не делать. [Или, по крайней мере, ничего, что требует данных]
Пусть страница просто посидит там.
... когда-нибудь в будущем ...
X. Ваша функция обратного вызова запустится и получит результаты вашей веб-страницы.
Ваша функция обратного вызова может:
* Отображение данных
* Присвойте эти данные переменной
* Вызывать другие функции
* Идите по веселому пути.