
17.05.2012, 10:37
|
sinistral
|
|
Регистрация: 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.
|