функция jquery getJSON, синхронизирующая проблему

Я думаю, что моя программа пропускает результат вызова JSON. Действительно ли возможно сделать функцию закрытия здесь или заставить программу ожидать вызова JSON к возврату?

function username_not_duplicate(username) {
   var function_name = "get_username";
   var parameters = [username];
   var url = "/get_functions.php?function_name=" + function_name + "&parameters=" + parameters;
   $.getJSON(url, function(user_name) {
      if (user_name == true) {     
         return true;
      }
   });
   return false;
}
6
задан Scott Evernden 5 August 2010 в 20:56
поделиться

3 ответа

Вызов API $. GetJSON () является асинхронным. Вы можете сделать это синхронным, используя $. Ajax () следующим образом:

function username_not_duplicate(username) {
   var function_name = "get_username";
   var parameters = [username];
   var url = "/get_functions.php?function_name=" + function_name + "&parameters=" + parameters;
   var rslt = false;
   $.ajax({
     async: false,
     url: url,
     dataType: "json",
     success: function(data) {
       if (data == true) {     
         rslt = true;
       }
     }
   });
   return rslt;
}
12
ответ дан 8 December 2019 в 12:17
поделиться

Ответ Дрю почти идеален, только отсутствует одна скобка и запятая для IE.

function username_not_duplicate(username) {
   var function_name = "get_username"; 
   var parameters = [username]; 
   var url = "camps/includes/get_functions.php?function_name=" + function_name + "&parameters=" + parameters;
   var rslt = false; 
   $.ajax({ 
         async: false, 
         url: url, 
         dataType: "json", 
         success: function(data) {
           if (data == true) {                   
             rslt = true; 
           }
        }, 
    });
    return rslt; 
}
3
ответ дан 8 December 2019 в 12:17
поделиться

Ага, username_not_duplicate просто возвращает false сразу, потому что getJSON асинхронный (т.е. неблокирующий). Оператор return true просто возвращает true из обработчика ответа. Обычно вам не следует делать такие блокирующие вызовы, которых вы пытаетесь достичь. Я полагаю, вы можете подумать о запоминании состояния запроса где-нибудь в глобальном масштабе.

1
ответ дан 8 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

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