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

Рейтинг: 3Ответов: 2Опубликовано: 21.02.2015

Сейчас я использую код вида:

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];
        }
}

Ответы

▲ 5Принят

@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);
});