Как вернуть значение из функции, которая вызывает $ .getJSON? - PullRequest
9 голосов
/ 17 ноября 2010
function lookupRemote(searchTerm)
{
   var defaultReturnValue = 1010;
   var returnValue = defaultReturnValue;

   $.getJSON(remote, function(data)
   {
      if (data != null)
      {
           $.each(data.items, function(i, item)
           {
               returnValue = item.libraryOfCongressNumber;
           });
      }
    });
    return returnValue;
}

Почему returnValue из этой функции всегда равно значению по умолчанию, установленному в начале функции, а не значению, полученному из поиска JSON?

Ответы [ 3 ]

13 голосов
/ 17 ноября 2010

Это происходит потому, что эта функция обратного вызова (function(data) {...}) выполняется позже , когда ответ возвращается ... потому что это асинхронная функция. Вместо этого используйте значение, как только оно будет установлено, например:

function lookupRemote(searchTerm)
{
    var defaultReturnValue = 1010;
    var returnValue = defaultReturnValue;
    $.getJSON(remote, function(data) {           
        if (data != null) {
              $.each(data.items, function(i, item) {                 
                    returnValue = item.libraryOfCongressNumber;
              });
        }
        OtherFunctionThatUsesTheValue(returnValue);
     });
}

Именно так должно быть все асинхронное поведение, запускать любое нужное значение, когда оно у вас есть ... то есть когда сервер отвечает данными.

9 голосов
/ 11 июня 2013

Если вы не хотите использовать асинхронную функцию, лучше используйте следующее:

function getValue(){
   var value= $.ajax({ 
      url: 'http://www.abc.com', 
      async: false
   }).responseText;
   return value;
}

Эта функция ожидает, пока значение не будет возвращено с сервера.

3 голосов
/ 17 ноября 2010

Функция, которую вы передаете getJSON, запускается , когда приходит ответ на HTTP-запрос , который не немедленно.

Оператор возврата выполняет до ответа, поэтому переменная еще не установлена.

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

...