Как сохранить результат вызова ajax в функции с использованием jQuery? - PullRequest
1 голос
/ 16 октября 2011

У меня есть следующий код:

function checkPermission(user) {
    var result = 'default';
    $.get('/mymodule/checkPermission.php?user=' + user, function(data) {
        result = data; // does not store data into result, why ?
        if (result == 'no') {
            $('.sorry_msg').show();
        }
    });
    alert(result); // shows "default".
    return result == 'yes';
}

Можете ли вы объяснить, почему это не работает? Проблема в том, что Я не могу сохранить переменную data в result, см. Комментарии в коде. Я думаю, это из-за анонимной функции , но я не знаю достаточно JavaScript, чтобы точно понять, что происходит.

Кроме того, как можно вернуть true или false в checkPermission функцию, основанную на результате вызова ajax?

Ответы [ 2 ]

5 голосов
/ 16 октября 2011

Вы не получите ожидаемый результат, потому что функция обратного вызова ajax выполняется асинхронно.Это означает, что процесс не ожидает завершения вызова ajax.Поэтому до того, как вызов ajax выполнил функцию обратного вызова, внешняя функция checkPermission уже завершена, и ее возвращаемое значение не будет изменено обратным вызовом ajax.

@ pinouchon:
I 'Мы видели ваше предлагаемое решение, но я бы не советовал использовать синхронные запросы Ajax, так как это заблокирует весь пользовательский интерфейс браузера на время ожидания результата запроса AJAX.Я бы посоветовал вам пересмотреть свою стратегию выполнения и построить ее на основе асинхронно выполняемых ajax-запросов.

2 голосов
/ 16 октября 2011

Метод jQuery get() является вызовом AJAX, поэтому асинхронен с вашим методом.Функция, которая вызывается при завершении вызова get(), которая изменяет значение результата, выполняет ПОСЛЕ вашего существующего предупреждения.Попробуйте это:

$.get('/mymodule/checkPermission.php?user=' + user, function(data) {
    result = data; // does not store data into result.
    alert("Ajax Complete!"); // NEW ALERT CALL - called upon Ajax Completion
    if (result == 'no') {
        $('.sorry_msg').show();
    }
});

Вы увидите, что порядок предупреждений «по умолчанию», а затем «Ajax Complete!»

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

...