Как вернуть значение из асинхронной функции обратного вызова?
Проблема с возвратом значения из асинхронного коллбэка
Я часто сталкиваюсь с вопросом, который уже задавался множество раз на Stack Overflow, но всё равно не могу найти решение своей проблемы.
Я пытаюсь получить значение из коллбэка в асинхронной функции. Вот пример кода для иллюстрации:
function foo(address) {
// работа с Google Maps
geocoder.geocode({ 'address': address }, function(results, status) {
results[0].geometry.location; // Я хочу вернуть это значение
});
}
foo(); // ожидаемый результат: значение results[0].geometry.location
Если я просто попытаюсь вернуть это значение, то получаю "undefined". Я нашёл несколько идей на Stack Overflow, но, похоже, они не сработали.
Вот альтернативная попытка, которую я сделал:
function foo(address) {
var returnvalue;
geocoder.geocode({ 'address': address }, function(results, status) {
returnvalue = results[0].geometry.location;
});
return returnvalue;
}
foo(); // всё равно undefined
Как я могу корректно вернуть значение из асинхронного вызова? Заранее спасибо за помощь!
2 ответ(ов)
Возвращать значения из колбеков не имеет смысла. Вместо этого выполните нужную работу "foo()" внутри вашего колбека.
Асинхронные колбеки вызываются браузером или каким-либо фреймворком, например, библиотекой геокодирования Google, когда происходят определённые события. Возвращённые значения не имеют места, куда бы можно было их отправить. Говоря иначе, колбек-функция может возвращать значение, но код, вызывающий эту функцию, не будет обращать внимания на возвращаемое значение.
Если вы используете jQuery, вам стоит попробовать следующее:
http://api.jquery.com/category/deferred-object/
Этот метод позволяет отложить выполнение вашего колбэк-функции до тех пор, пока AJAX-запрос (или любая асинхронная операция) не завершится. Также это можно использовать для вызова колбэка после завершения нескольких AJAX-запросов.
Длина объекта в JavaScript
Как проверить, является ли объект массивом?
Как загружать файлы асинхронно с помощью jQuery?
Как заставить jQuery выполнять синхронный запрос Ajax вместо асинхронного?
Почему моя переменная не изменяется после модификации внутри функции? - Ссылка на асинхронный код