возврат функции JavaScript, не работающий

Да, необходимо синхронизировать доступы. В C++ 0x это будет гонка данных и неопределенное поведение. С потоками POSIX это уже - неопределенное поведение.

На практике, Вы могли бы получить плохие значения, если тип данных больше, чем собственный размер слова. Кроме того, другой поток никогда не мог бы видеть значение, записанное из-за оптимизации, перемещающей чтение и/или запись.

6
задан Stanni 13 November 2009 в 23:09
поделиться

7 ответов

Вы должны знать две вещи:

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. Надеюсь, это немного объясняет.

12
ответ дан 8 December 2019 в 13:00
поделиться

Ваша функция sessionStatus () ничего не возвращает, поэтому в предупреждении указано undefined .

Все, что делает функция, - это настраивает выполнение вызова AJAX после загрузки страницы - на самом деле ничего не происходит внутри sessionStatus () , которое могло бы быть возвращено.

2
ответ дан 8 December 2019 в 13:00
поделиться

Ваша функция sessionStatus () никогда ничего не возвращает. Он устанавливает функцию для запуска позже, и эта функция что-то возвращает, но это не имеет ничего общего с sessionStatus ()

1
ответ дан 8 December 2019 в 13:00
поделиться

Функция sessionStatus просто устанавливает прослушиватель событий для $ (document) .ready (), а затем возвращается, не возвращая значения. Вы видите это неопределенное значение.

Позже, когда запускается $ (document) .ready (), он вызывает ajax, который в случае успеха возвращает статус, но ничто не получает этот статус.

1
ответ дан 8 December 2019 в 13:00
поделиться

Вы возвращаете значение, когда завершается событие готовности документа. Куда должна идти ваша ценность? Объект jQuery не знает, что с ним делать.

1
ответ дан 8 December 2019 в 13:00
поделиться
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 ())

1
ответ дан 8 December 2019 в 13:00
поделиться

Функции никогда не должны включаться в функцию jQuery (документ) .ready. Разделите их, чтобы у вас не было побочных эффектов, которых вы не хотели бы иметь. Как вы хотите называть статус сеанса? А функция ведьмы должна получить возвращаемое значение?

0
ответ дан 8 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: