JQuery GetJSON функция синхронизации проблема - PullRequest
6 голосов
/ 06 августа 2010

Я думаю, что моя программа пропускает результат вызова 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;
}

Ответы [ 4 ]

12 голосов
/ 06 августа 2010

Вызов 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;
}
3 голосов
/ 28 января 2014

Другой вариант - использовать функцию обратного вызова и передать ее функции, которая выполняет getJSON, следующим образом:

//this is the function that executes my getJSON
//callback is the name of my callback function
function getMyData( callback ){

  //here you do your getJSON call
  $.getJSON(url, function(items){

    //do your stuff here

    //call your function here (at the end)
    callback();

  });

}

Таким образом, ваша функция обратного вызова будет вызываться в конце вызова getJSON.

3 голосов
/ 06 августа 2010

Ответ Дрю почти идеален, пропущена одна скобка и запятая для 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; 
}
1 голос
/ 06 августа 2010

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

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