Запрос $ .ajax ({async: false}) все еще запускается асинхронно? - PullRequest
33 голосов
/ 07 октября 2009

У меня тут небольшая проблема, ребята. Я пытаюсь реализовать следующий сценарий:

  1. Пользователь открывает домашнюю страницу и видит список других пользователей и щелкает чтобы добавить его в список друзей.
  2. Я отправляю Ajax-запрос к ресурсу сервера для проверки, если пользователь вошел в систему, если так, я выдаю другой запрос AJAX на другой сервер ресурс, чтобы фактически добавить его в список друзей пользователя.

Звучит просто? Вот что я сделал: я создал функцию isLoggedIn, которая выдаст первый запрос на сервер, чтобы определить, вошел ли пользователь в систему. Я выдаю этот запрос, используя метод jQuery.ajax. Вот моя функция выглядит так:

function isLoggedIn() {

    $.ajax({
    async: "false",
        type: "GET",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        url: "/isloggedin",
        success: function(jsonData) {
            alert("jsonData =" + jsonData.LoggedIn);
            return jsonData.LoggedIn;
        }
    });
}

Возвращенный JSON очень прост, он выглядит следующим образом:

{ LoggedIn: true } or { LoggedIn : false } 

Теперь этот метод действительно работает и правильно отображает предупреждение: JsonData = true, если вы вошли в систему, и JsonData = false, если вы не вошли в систему. До этого момента проблем не было, проблема возникает, когда я пытаюсь вызвать этот метод: я называю его так:

$(".friend_set .img").click(function() {
    debugger;
    if (isLoggedIn()) { 

        alert("alredy logged in");
        trackAsync();
        popupNum = 6;
    }
    else {
        alert("not logged in"); //always displays this message.
        popupNum = 1;
    }
    //centering with css

    centerPopup(popupNum);
    //load popup
    loadPopup(popupNum);
    return false;

});

Вызов isLoggedIn всегда возвращает false, и возвращается false before the ajax request finishes (because the message jsonData = true is displayed after the message "not logged in". I made sure that the request is **NOT** Asynchronous by stating async: false`!

Видимо, он все еще работает асинхронно. Что мне здесь не хватает, ребята?

1 Ответ

62 голосов
/ 07 октября 2009

Вам нужно async:false, а не async:"false". (то есть передать логическое значение false, а не строку "false").

Edit: также с асинхронными запросами вам необходимо вернуть значение после вызова ajax, not внутри вашего обработчика успеха:

function isLoggedIn() {
    var isLoggedIn;
    $.ajax({
        async: false,
        // ...
        success: function(jsonData) {
            isLoggedIn = jsonData.LoggedIn
        }
    });
    return isLoggedIn 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...