функция возврата JavaScript не работает - PullRequest
5 голосов
/ 14 ноября 2009

У меня проблема с возвратом переменной в мою функцию, скрипт ниже работает нормально:

function sessionStatus(){
    $(document).ready(function(){
        $.getJSON(scriptRoot+"sessionStatus.php",function(status){
            alert(status);
        });
    });
}

sessionStatus();

Ставка, когда я пытаюсь сделать следующее, я получаю окно с сообщением "undefined":

function sessionStatus(){
    $(document).ready(function(){
        $.getJSON(scriptRoot+"sessionStatus.php",function(status){
            return status;
        });
    });
}
alert(sessionStatus());

Это действительно беспокоит меня, я просто не могу понять, что я сделал неправильно.

Ответы [ 7 ]

12 голосов
/ 14 ноября 2009

Есть две вещи, которые вы должны знать:

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

2 голосов
/ 14 ноября 2009

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

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

Код в function(status) { ...} не запускается до тех пор, пока вызов AJAX на сервер не вернет значение, и этот вызов AJAX не будет отправлен до тех пор, пока страница не загрузится.

Вы должны прочитать о том, что на самом деле $.getJSON() и $(document).ready() делают, потому что вы будете продолжать вводить в заблуждение, пока не поймете их правильно.

1 голос
/ 14 ноября 2009
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 голос
/ 14 ноября 2009

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

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

1 голос
/ 14 ноября 2009

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

1 голос
/ 14 ноября 2009

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

0 голосов
/ 14 ноября 2009

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

...