Дополнительно
библиотека 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;
}
444
5
Примечание: этот ответ был написан в феврале 2010 года.<БР>см. обновление от 2015, 2016 и 2017 внизу. Вы можете'т ничего возвращать из функции, которая является асинхронной. Что вы можете вернуть это обещание. Я объяснил, как обещает работать в jQuery в мой ответы на эти вопросы:
вы можете написать свои функции testAjax такой:
Затем вы можете получить ваш посыл такой:
Вы можете хранить свое обещание, вы можете передать его вокруг, вы можете использовать его в качестве аргумента при вызове функции, и вы можете вернуть его из функции, но когда Вы, наконец, хотите использовать данных, возвращаемый AJAX-вызов, вы должны сделать это так:
(См. обновление ниже для упрощенного синтаксиса.) Если данные доступны на данный момент, эта функция будет автоматически вызываться. Если это'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.
Как вернуть реальное обещание
Функция из моего примера выше:
возвращает объект jqXHR, который является jQuery отложенный объект. Чтобы сделать его возвращение было настоящим обещанием, вы можете изменить его, используя [метод от вопрос Вики(https://github.com/kriskowal/q/wiki/Coming-from-jQuery#converting-jquery-promises-to-q):
или, используя метод из статьи в HTML5 пород:
Это Обещание.решить($.Аякс(...))
тоже, что описано в "обещания" документация модуля](https://github.com/then/promise#promiseresolvevalue) и он должен работать с [ЕС6
Promise.resolve()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve). Использовать сегодня на ES6 обещания вы можете использовать [ЕС6-обещаю модуль'полифилл с
()`] (https://github.com/jakearchibald/es6-promise#auto-polyfill) Джейк Арчибальд. Чтобы увидеть, где вы можете использовать на ES6 обещания без полифилл, см.: Я могу использовать: обещания. Для более подробной информации смотрите:Будущее на jQuery
Будущие версии jQuery (начиная с 3.Х - текущие стабильные версии по состоянию на май 2015 года 1.X и 2.х) будут совместимы с [обещания/спецификации+] (http://promises-aplus.github.io/promises-spec/) (спасибо Бенджамин Gruenbaum для указания в комментариях). "в две смены, что мы'ве уже решено перспективы/а+ совместимость для нашей отложенной реализации [...] и" (в jQuery 3.0 и будущее веб-разработки). Для более подробной информации смотрите: в jQuery 3.0: будущие поколения Дэйв Метвин и в jQuery 3.0: больше взаимодействия, меньше Эксплорера Павел криля.
Интересные переговоры##
[На JavaScript обещания](https://youtu.be/oa2clhsYIDY) Дэвид М. Ли (Nodevember 2014) Обновление (2016)
Есть новый синтаксис в в ECMA-262, 6-е издание, раздел 14.2 называется стрелочные функции, которые могут быть использованы для дальнейшего упрощения приведенных выше примерах. С помощью jQuery API, то вместо:
вы можете написать:
или с помощью обещания/а+ API-интерфейс:
Помните, чтобы всегда использовать обработчики отклонения либо с:
или с:
Увидеть этот ответ, чтобы увидеть, почему вы всегда должны использовать обработчики отказ с обещаниями:
потому что вы'снова звоню
тревога` с теми же аргументами, что ваш обратного вызова, но стрелка синтаксис является более общим и позволяет писать такие вещи, как:Не каждый браузер поддерживает этот синтаксис, но есть определенные случаи, когда вы're уверен, что браузер будет выполняться ваш код - например, при написании Chrome расширение, в Firefox дополнения, или настольного приложения с использованием электронно, NW.js или AppJS (см. Этот answer для деталей). Для поддержки функции стрелочку, см.:
ждут
ключевое слово, вместо этого кода:позволяет писать:
Вы можете только использовать его внутри функции создается с "асинхронный" ключевое слово. Для получения дополнительной информации см.:
async
иждут
Вы можете использовать Бабеля:компанию
или Блюберд сопрограммы:http://bluebirdjs.com/docs/api/promise.coroutine.html Подробнее
Несколько вопросов про обещания для более подробной информации:
Единственный способ вернуть данные из функции можно было бы сделать синхронный вызов, а не асинхронный вызов, но что бы заморозить браузер, пока он'ы жду ответ.
Вы можете передать в функцию обратного вызова, которая обрабатывает результат:
Назовем это так:
вы можете добавить асинхронный параметр в false и возврат вне AJAX-вызов.
ИДК, если вы, парни, решать, но я рекомендую другой способ сделать это, и это работает :)
Поэтому основная идея здесь заключается в том, что при добавлении асинхронные: ложные, то вы делаете все ждет, пока данные извлекаются. Затем его необходимо присвоить статической переменной класса, и все волшебным образом работает :)
Увидеть пример работы с jQuery документы: http://api.jquery.com/jQuery.ajax/ (около 2/3 страницы)
Вы можете искать следующий код:
Же странице...внизу.