У меня есть функция, которая в основном выглядит так:
function defTest()
{
var dfd = new jQuery.Deferred();
$.ajax(
{
type: "GET",
url: 'http://XXXX',
cache: false,
dataType: "json",
success: function(data,status)
{
console.log('ajax done: success');
dfd.resolve();
},
error: function(data,status)
{
console.log('ajax done: fail');
dfd.reject();
}
});
console.log('about to return dfd');
return dfd;
}
Я называю это так:
defTest().then(.....);
Журнал консоли выдает следующее: собирается вернуть dfd code.js:106 ajax done: success code.js:96
Что меня смущает, так это то, что код работает. Тем не менее dfd возвращается ДО завершения ajax. Поэтому я удалил возврат dfd. И поместите его последним в каждую функцию обработчика ajax, чтобы убедиться, что это НЕ будет возвращено, пока Ajax не завершится.:
success: function(data,status)
{
console.log('ajax done: success');
dfd.resolve();
return dfd;
}
Тогда это вообще не работало. Я смущен! Может ли кто-нибудь объяснить мне, почему мой отложенный объект не может быть в обработчиках успеха и ошибок ajax и почему он работает, даже если кажется, что мой отложенный объект возвращается, даже если он запускается ДО завершения Ajax, а затем разрешается или отклоняется? Как это вообще возможно?
РЕДАКТИРОВАТЬ: Эта проблема напрямую связана с моей предыдущей неотвеченной и более сложной функцией: Проблемы с отложенным объектом
Вот почему я не могу просто «вернуть ajax (...)», потому что моя реальная функция содержит другие вызовы ajax, которые будут отделены от ОДНОГО результата, возвращаемого вызывающей стороне.
$.ajax
уже возвращает отложенный объект, как ответил xdazz. JavaScript является однопоточным, вызовы функций синхронны и должны возвращать значение (или ничего) синхронно.$.ajax
является асинхронным. Что вы можете (и должны) сделать, так это использовать обратный вызов успеха ajax, чтобы сделать то, что вам нужно сделать, когда запрос ajax будет завершен. - person Fabrício Matté   schedule 12.09.2012