5

Как вернуть значение из асинхронной функции обратного вызова?

13

Проблема с возвратом значения из асинхронного коллбэка

Я часто сталкиваюсь с вопросом, который уже задавался множество раз на 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 ответ(ов)

0

Возвращать значения из колбеков не имеет смысла. Вместо этого выполните нужную работу "foo()" внутри вашего колбека.

Асинхронные колбеки вызываются браузером или каким-либо фреймворком, например, библиотекой геокодирования Google, когда происходят определённые события. Возвращённые значения не имеют места, куда бы можно было их отправить. Говоря иначе, колбек-функция может возвращать значение, но код, вызывающий эту функцию, не будет обращать внимания на возвращаемое значение.

0

Если вы используете jQuery, вам стоит попробовать следующее:
http://api.jquery.com/category/deferred-object/

Этот метод позволяет отложить выполнение вашего колбэк-функции до тех пор, пока AJAX-запрос (или любая асинхронная операция) не завершится. Также это можно использовать для вызова колбэка после завершения нескольких AJAX-запросов.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь