Да, необходимо синхронизировать доступы. В C++ 0x это будет гонка данных и неопределенное поведение. С потоками POSIX это уже - неопределенное поведение.
На практике, Вы могли бы получить плохие значения, если тип данных больше, чем собственный размер слова. Кроме того, другой поток никогда не мог бы видеть значение, записанное из-за оптимизации, перемещающей чтение и/или запись.
Вы должны знать две вещи:
1: объект JSON является асинхронным, поэтому вызов функции sessionStatus может быть выполнен, когда JSON все еще загружается. Следующее будет работать:
function sessionStatus(callback){
$(document).ready(function(){
$.getJSON(scriptRoot + "sessionStatus.php", function(status){
callback(status);
});
});
}
sessionStatus(function(s){alert(s);});
или, скорее:
function sessionStatus(callback){
$(document).ready(function(){
$.getJSON(scriptRoot + "sessionStatus.php", callback);
});
}
sessionStatus(function(s){alert(s);});
2: даже если это будет синхронно, вы только отдаете возвращаемое значение из внутренней функции, поэтому sessionStatus ничего не вернет. Посмотрите этот код (не связанный с вашим JSON):
function do() {
var x = 0;
(function(){
x = 2;
})();
return x;
}
или:
function do() {
var x = (function(){
return 2;
})();
return x;
}
Оба возвращают 2. Надеюсь, это немного объясняет.
Ваша функция sessionStatus ()
ничего не возвращает, поэтому в предупреждении указано undefined
.
Все, что делает функция, - это настраивает выполнение вызова AJAX после загрузки страницы - на самом деле ничего не происходит внутри sessionStatus ()
, которое могло бы быть возвращено.
Ваша функция sessionStatus () никогда ничего не возвращает. Он устанавливает функцию для запуска позже, и эта функция что-то возвращает, но это не имеет ничего общего с sessionStatus ()
Функция sessionStatus просто устанавливает прослушиватель событий для $ (document) .ready (), а затем возвращается, не возвращая значения. Вы видите это неопределенное значение.
Позже, когда запускается $ (document) .ready (), он вызывает ajax, который в случае успеха возвращает статус, но ничто не получает этот статус.
Вы возвращаете значение, когда завершается событие готовности документа. Куда должна идти ваша ценность? Объект jQuery не знает, что с ним делать.
function sessionStatusCallback(status)
{
alert(status);
}
function sessionStatus(){
$(document).ready(function(){
$.getJSON(scriptRoot+"sessionStatus.php",function(status){
sessionStatusCallback(status);
});
});
}
sessionStatus();
Ваша функция вызывается асинхронно - фактически после двух асинхронных вызовов, выполненных через .ready () и .getJSON (). В таком случае нет доступного возвращаемого значения, вместо этого вы должны использовать обратный вызов, как указано выше, для обработки ответа.
Хотя я должен отметить, что функция, переданная getJSON в приведенном выше примере , уже является обратный вызов. Вы можете изменить это определение функции на «sessionStatusCallback», и оно будет вызывать указанный выше обратный вызов, как только JSON будет готов, и вы сможете продолжить обработку там. Или ... продолжить обработку в текущем обратном вызове (вопрос стиля, использовать ли ссылку на функцию или объявлять анонимную функцию прямо здесь, в вызове .getJSON ())
Функции никогда не должны включаться в функцию jQuery (документ) .ready. Разделите их, чтобы у вас не было побочных эффектов, которых вы не хотели бы иметь. Как вы хотите называть статус сеанса? А функция ведьмы должна получить возвращаемое значение?