библиотека jQuery: возвращение данных после успешного AJAX-вызов

У меня что-то вроде этого, где это простой вызов скрипта, который возвращает мне значение, строку..

function testAjax() {
    $.ajax({
      url: "getvalue.php",  
      success: function(data) {
         return data; 
      }
   });
}

но если я называю что-то вроде этого

var output = testAjax(svar);  // output will be undefined...

так как я могу вернуть значение? приведенный ниже код не похоже на работу либо...

function testAjax() {
    $.ajax({
      url: "getvalue.php",  
      success: function(data) {

      }
   });
   return data; 
}
Комментарии к вопросу (2)

Примечание: этот ответ был написан в феврале 2010 года.<БР>см. обновление от 2015, 2016 и 2017 внизу. Вы можете'т ничего возвращать из функции, которая является асинхронной. Что вы можете вернуть это обещание. Я объяснил, как обещает работать в jQuery в мой ответы на эти вопросы:

function testAjax() {
  $.ajax({
    url: "getvalue.php",  
    success: function(data) {
      return data; 
    }
  });
}

вы можете написать свои функции testAjax такой:

function testAjax() {
  return $.ajax({
      url: "getvalue.php"
  });
}

Затем вы можете получить ваш посыл такой:

var promise = testAjax();

Вы можете хранить свое обещание, вы можете передать его вокруг, вы можете использовать его в качестве аргумента при вызове функции, и вы можете вернуть его из функции, но когда Вы, наконец, хотите использовать данных, возвращаемый AJAX-вызов, вы должны сделать это так:

promise.success(function (data) {
  alert(data);
});

(См. обновление ниже для упрощенного синтаксиса.) Если данные доступны на данный момент, эта функция будет автоматически вызываться. Если это't, то он будет вызван, как только данные доступны. Весь смысл всего этого заключается в том, что ваши данные не будут доступны сразу после вызова $.Аякс, потому что он является асинхронным. Обещания-это хорошая абстракция для функции, чтобы сказать: я могу'т вернуть вам данные, потому что я Дон'т иметь его, и я не'т хотите, чтобы заблокировать и сделать вас ждать так вот'ы обещание вместо того, чтобы и вы'll быть в состоянии использовать его в дальнейшем, или чтобы просто отдать кому-нибудь и дело с концом. Видите эту [демо](http://jsfiddle.net/jW68r/). Обновление (2015)

В настоящее время (по состоянию на март 2015) на jQuery обещания не совместимы с обещания/а+ спецификация что означает, что они не могут сотрудничать с другими обещания/а+ совместимых реализаций. Однако библиотека jQuery обещает в следующей версии 3.х будет быть совместимы с обещаниями/спецификации+ (спасибо Бенджамин Gruenbaum за указание на это). В настоящее время (Май, 2015) стабильной версии jQuery являются 1.X и 2.х.

То, что я объяснил выше (в марте 2011) - это способ использовать в jQuery отложенные объекты, чтобы делать что-то асинхронно, что в синхронном коде будет достигнута, возвращая значение. Но синхронный вызов функции может сделать две вещи - он может либо возвращать значение (если это возможно) или исключение (если он может'т вернуть значение). Обещания/а+ адреса обоих этих случаях используется таким образом, что довольно много, как мощный, как обработка исключений в синхронном коде. В версии jQuery обрабатывает эквивалент возвращая значение только хорошо, но эквивалентной комплексной обработки исключений-это несколько проблематично. В частности, вся суть обработки исключений в синхронном коде, это не просто дача с хорошим сообщением, но стараются устранить проблему и продолжить выполнение, или, возможно, повторно один и тот же или разные исключения для некоторых других частей программы для обработки. В синхронном коде у вас есть стек вызовов. В асинхронном называть тебя Дон'т и расширенная обработка исключений внутри вашего обещания, как того требует обещания/спецификации+ может реально помочь вам написать код, который будет обрабатывать ошибки и исключения осмысленно даже для сложных случаев применения. Для различия между jQuery и другие реализации, и как конвертировать в jQuery обещает обещания/совместимый+, см. приходя с jQuery Крис Коваль и соавт. на вопрос Вики-библиотеки и обещает приехать в JavaScript Джейк Арчибальд в HTML5.

Как вернуть реальное обещание

Функция из моего примера выше:

function testAjax() {
  return $.ajax({
      url: "getvalue.php"
  });
}

возвращает объект jqXHR, который является jQuery отложенный объект. Чтобы сделать его возвращение было настоящим обещанием, вы можете изменить его, используя [метод от вопрос Вики(https://github.com/kriskowal/q/wiki/Coming-from-jQuery#converting-jquery-promises-to-q):

function testAjax() {
  return Q($.ajax({
      url: "getvalue.php"
  }));
}

или, используя метод из статьи в HTML5 пород:

function testAjax() {
  return Promise.resolve($.ajax({
      url: "getvalue.php"
  }));
}

Это Обещание.решить($.Аякс(...))тоже, что описано в "обещания" документация модуля](https://github.com/then/promise#promiseresolvevalue) и он должен работать с [ЕС6Promise.resolve()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve). Использовать сегодня на ES6 обещания вы можете использовать [ЕС6-обещаю модуль&#39;полифилл с()`] (https://github.com/jakearchibald/es6-promise#auto-polyfill) Джейк Арчибальд. Чтобы увидеть, где вы можете использовать на ES6 обещания без полифилл, см.: Я могу использовать: обещания. Для более подробной информации смотрите:

promise.success(function (data) {
  alert(data);
});

вы можете написать:

promise.success(data => alert(data));

или с помощью обещания/а+ API-интерфейс:

promise.then(data => alert(data));

Помните, чтобы всегда использовать обработчики отклонения либо с:

promise.then(data => alert(data), error => alert(error));

или с:

promise.then(data => alert(data)).catch(error => alert(error));

Увидеть этот ответ, чтобы увидеть, почему вы всегда должны использовать обработчики отказ с обещаниями:

promise.then(data => alert("x is " + data.x));

Не каждый браузер поддерживает этот синтаксис, но есть определенные случаи, когда вы're уверен, что браузер будет выполняться ваш код - например, при написании Chrome расширение, в Firefox дополнения, или настольного приложения с использованием электронно, NW.js или AppJS (см. Этот answer для деталей). Для поддержки функции стрелочку, см.:

  • Есть еще один новый синтаксис сейчас называется асинхронные функции с новой ждут ключевое слово, вместо этого кода:
functionReturningPromise()
    .then(data => console.log('Data:', data))
    .catch(error => console.log('Error:', error));

позволяет писать:

try {
    let data = await functionReturningPromise();
    console.log('Data:', data);
} catch (error) {
    console.log('Error:', error);
}

Вы можете только использовать его внутри функции создается с "асинхронный" ключевое слово. Для получения дополнительной информации см.:

Комментарии (9)
Решение

Единственный способ вернуть данные из функции можно было бы сделать синхронный вызов, а не асинхронный вызов, но что бы заморозить браузер, пока он'ы жду ответ.

Вы можете передать в функцию обратного вызова, которая обрабатывает результат:

function testAjax(handleData) {
  $.ajax({
    url:"getvalue.php",  
    success:function(data) {
      handleData(data); 
    }
  });
}

Назовем это так:

testAjax(function(output){
  // here you use the output
});
// Note: the call won't wait for the result,
// so it will continue with the code here while waiting.
Комментарии (7)

вы можете добавить асинхронный параметр в false и возврат вне AJAX-вызов.

function testAjax() {
    var result="";
    $.ajax({
      url:"getvalue.php",
      async: false,  
      success:function(data) {
         result = data; 
      }
   });
   return result;
}
Комментарии (7)

ИДК, если вы, парни, решать, но я рекомендую другой способ сделать это, и это работает :)

    ServiceUtil = ig.Class.extend({
        base_url : 'someurl',

        sendRequest: function(request)
        {
            var url = this.base_url + request;
            var requestVar = new XMLHttpRequest();
            dataGet = false;

            $.ajax({
                url: url,
                async: false,
                type: "get",
                success: function(data){
                    ServiceUtil.objDataReturned = data;
                }
            });
            return ServiceUtil.objDataReturned;                
        }
    })

Поэтому основная идея здесь заключается в том, что при добавлении асинхронные: ложные, то вы делаете все ждет, пока данные извлекаются. Затем его необходимо присвоить статической переменной класса, и все волшебным образом работает :)

Комментарии (1)

Увидеть пример работы с jQuery документы: http://api.jquery.com/jQuery.ajax/ (около 2/3 страницы)

Вы можете искать следующий код:

    $.ajax({
     url: 'ajax/test.html',
     success: function(data) {
     $('.result').html(data);
     alert('Load was performed.');
   }
});

Же странице...внизу.

Комментарии (0)