Показать сообщение отдельно
  #67 (permalink)  
Старый 17.05.2012, 10:37
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Насчёт возвращения значения из функции аяксового запроса в jQuery.


Вопрос :

у меня код возвращает deferred\undefined, вместо результата запроса!
function req(){
    return $.ajax({
        url: '/foo.php',
        method: 'GET',
        success: function(data){
            return data; // <-- проблема тут?
        }
    });
}

var myData = req();
alert(myData);

Ответ :

Проблема в том, что в jQuery по-умолчанию (без указания параметра async в false) совершаются асинхронные* запросы, поэтому функция - обработчик события завершения запроса (success) - исполнится через какое-то время. А интерпретатор JS будет исполнять код дальше, не дожидаясь конца запроса, и получается, что функция возвратит результат работы $.ajax ($.Deferred), или undefined.

* асинхронные в смысле асинхронности самого JS.
Как решить?

Либо указывайте параметр синхронного запроса (async: false), но будьте готовы к заморозке интерфейса на время совершения запроса, либо оборачивайте код, использующий результат запроса в функцию и указывайте её в success, тогда будет гарантия на то, что код исполнится в тот момент, когда данные получены:
function req(){
    return $.ajax({
        url: '/foo.php',
        method: 'GET',
        success: function(data){
            handle(data);
        }
    });
}

var handle = function(data){
    alert(data);
}


P.S. каждый день этот вопрос задают. буду ссыль кидать на этот пост

Последний раз редактировалось melky, 19.06.2012 в 19:52.
Ответить с цитированием