Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Как вернуть значение из вложенной функции? [дубликат]

#jquery #javascript


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Как вернуть значение из события или из функции обратного
вызова? Или хотя бы дождаться их окончания
                                
                                    (3 ответа)
                                
                        
                                Закрыт 3 года назад.
            
                    
Сейчас я использую код вида:
function getData(key, id)
{
    var data = '';

    $.get(
        'http://site.com/gate.php',
        {'key': key, 'id': id, 'action': 'get'},
        function (res) {
            data = res.split('|')[1];
        }

    return data;
}

Вопрос: можно ли как-то возвращать результат из замыкания передаваемого в $.get()?
Что-то вроде этого:
function getData(key, id)
{
    return $.get(
        'http://site.com/gate.php',
        {'key': key, 'id': id, 'action': 'get'},
        function (res) {
            return res.split('|')[1];
        }
}
    


Ответы

Ответ 1



@Deonis всё правильно написал, но поддержка браузерами нативных Promises далека от идеала. Ждём Spartan Существуют множество полифиллов, в том числе и для JQuery. function getData(key, id){ var dfd = $.Deferred(), data = {'key': key, 'id': id, 'action': 'get'}; $.get('http://site.com/gate.php', data) .done(function (response) { response = 'foo|bar|baz'; // предположим, что response вернул такую строчку dfd.resolve(response); }) .fail(dfd.reject); return dfd; } getData(10, 100).then(function (response) { alert(response.split('|')[1]); }, function (error) { // обработчик ошибок }); Смотреть результат здесь Update Вы можете явно указать, чтобы $.ajax возвращал вам синхронно, но такой подход в корне неверный. function getData(key, id){ var result; $.ajax({ url: 'http://site.com/gate.php', type: 'GET', async: false, data: { key: key, id: id, action: 'get' }, }) .done(function(response){ response = 'foo|bar|baz'; // предположим, что response вернул такую строчку result = response.split('|')[1]; }) .fail(function(){ // обработчик ошибок }); return result; } alert(getData(10, 100)); Смотреть результат здесь

Ответ 2



function getData(key, id) { return new Promise(function (resolve, reject) { $.ajax({ url: 'http://site.com/gate.php', type: 'GET', data: { key: key, id: id, action: 'get' }, error: reject, success: function (res) { resolve(res.split('|')[1]); } }); }); } getData(10, 100).then(function (response) { console.log("Всё гуд!", response); }, function (error) { alert('Хьюстон! У нас проблемы!: ' + error.statusText); });

Комментариев нет:

Отправить комментарий