JavaScript, если (function_foo ()) не ожидает завершения function_foo () - PullRequest
1 голос
/ 12 октября 2009

У меня есть утверждение if:

    if(authenticate_session("secret_password12345")){
        alert("You are authenticated");
    }else{
        alert("Intruder alert!");
    }

и функция аутентификации javascript, которая делает JQuery POST AJAX-запрос к серверу для выполнения фактической аутентификации и возвращает true или false:

function authenticate_session(session_id){
 $.post("/auth.php",
    { action: "authenticate_session", login_id: session_id },
    function(data){
        if(data == "denied"){
            alert("denied");
            return false;
        }else if(data == "accepted"){
        alert("accepted");
            return true;
        }
    },
"text");
}

Однако, когда оператор if вызывает функцию аутентификации, он не ожидает завершения AJAX и всегда выполняет «else». Если я добавлю «вернуть истину»; в первой строке функции аутентификации, перед ajax, оператор if работает так, как ожидается => alert («You are authenticated»).

Я знаю, что серверная часть работает правильно, так как оповещение («отказано») и оповещение («принято») вызываются, как и ожидалось (но интересно, после оповещений оператора if).

Как заставить мой оператор if ждать, пока не завершится функция аутентификации?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 12 октября 2009

Это не ожидание, потому что это асинхронный запрос по умолчанию. Установите параметр async на false, чтобы он был синхронным. Из документов:

По умолчанию все запросы отправляются асинхронный (т. е. установлен на true по умолчанию). Если вам нужно синхронно запросы, установите для этой опции значение false. Обратите внимание, что синхронные запросы могут временно заблокировать браузер, отключение любых действий во время запрос активен.

3 голосов
/ 12 октября 2009

я не думаю, что вы можете сделать, если оператор "ждет" ajax, просто переместите логику this в функцию обратного вызова ajax (ну, вы на самом деле уже сделали: alert (denied | accept))

2 голосов
/ 12 октября 2009

Сказано ранее. Ajax делает подобные вызовы асинхронными. Ожидание этого может заблокировать ваш браузер (не желательно). Поэтому вы должны использовать метод обратного вызова для обработки ваших данных. Это сделает ваш код ответственным за разделение правильных вещей.

function authenticate_session(session_id, callbacksuccess){
  $.post("/auth.php",
  { action: "authenticate_session", login_id: session_id },
  callback,
  "text");
}

function callback(data) {
  if (data == "denied") {
    alert('denied');
  } else if (data == "accepted") {
    alert('accepted');
  }
}

authenticate_session('secret_password12345", callback);
0 голосов
/ 12 октября 2009

Спасибо за все ваши ответы.

Ответом оказалось то, что возвращение в методе ajax возвращалось из метода ajax, а не функции аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...