Ваш пример очень хорош.Ваша проблема в том, что вы не понимаете последствий того, что JavaScript в основном асинхронный.
Позвольте мне перейти к вашему примеру, чтобы показать вам.
- Запустится ваш обработчик документов.
- Он вызывает
riseData
. riseData
объявляет переменную, jsonResult
. riseData
вызывает $.ajax
, которая планирует выполнение запроса AJAX,но ответ произойдет позже. - Поскольку
$.ajax
обычно неблокируемый / асинхронный, riseData
продолжается и возвращает jsonResult
.Поскольку jsonResult
еще не было назначено, поскольку запрос AJAX не был выполнен, возвращается значение по умолчанию undefined
. - В обработчике готовности документа вы получите
alert("Outside: "+undefined);
.
Цикл событий через несколько миллисекунд, это происходит:
- Запрос AJAX завершен.jQuery перенаправляет это на ваш обратный вызов.
jsonResult
установлено, но riseData
уже возвращено. alert
внутри riseData
предупреждает о новых данных после того, какобработчик готовых документов уже предупредил undefined
.
Существует два решения этой проблемы.Первое решение простое, но часто приводит к ухудшению взаимодействия с пользователем.Это решение заключается в добавлении опции async: false
к $.ajax
.Это заставляет $.ajax
блокировать и замораживать браузер.
Вторым решением является использование асинхронного стиля практически для всего.Это означает, что riseData
принимает обратный вызов и вызывает его в обработчике ответа AJAX.Вот ваш код, преобразованный с помощью этого метода:
function riseData(callback) {
$.ajax({
success: function(data, textStatus, jqXHR){
var jsonResult = jqXHR.responseText;
alert("Inside: " + jsonResult);
callback(jsonResult);
},
error: function (jqXHR, textStatus, errorThrown) {
$('#errLog').append('<br>Status: ' + qXHR.statusText);
}
});
}
$(document).ready(function(){
//var intervalID = setInterval('UTCclock()',100);
// Unrelated, but it's better to pass a
// function into setInterval than a string.
var intervalID = setInterval(UTCclock, 100);
riseData(function(jsonResult) {
alert("Outside: " + jsonResult);
});
});