JQuery: откат обратной связи для отказавшего запроса AJAX
Может ли jQuery предоставить резервную копию неудачных вызовов AJAX? Это моя попытка:
function update() {
var requestOK = false;
$.getJSON(url, function(){
alert('request successful');
requestOK = true;
});
if (!requestOK) {
alert('request failed');
}
}
К сожалению, даже если вызвана функция обратного вызова метода $.getJSON(), я получаю сообщение "запрос не выполнен", прежде чем функция обратного вызова имеет возможность установить переменную requestOK. Я думаю, это потому, что код работает параллельно. Есть ли способ справиться с такими ситуациями? Я думал о цепочке или каком-то ожидании запроса AJAX, включая функцию обратного вызова. Но как? Кто-нибудь знает, как это сделать?
Ответы
Ответ 1
Вам нужно либо использовать нижний уровень $. ajax, либо ajaxError. Вот он с методом $.ajax:
function update() {
$.ajax({
type: 'GET',
dataType: 'json',
url: url,
timeout: 5000,
success: function(data, textStatus ){
alert('request successful');
},
error: function(xhr, textStatus, errorThrown){
alert('request failed');
}
});
}
EDIT Я добавил вызов timeout
в вызов $.ajax
и установил его на пять секунд.
Ответ 2
Ответ Dougs правильный, но вы действительно можете использовать $.getJSON
и ловить ошибки (не используя $.ajax
). Просто соедините вызов getJSON
с вызовом функции fail
:
$.getJSON('/foo/bar.json')
.done(function() { alert('request successful'); })
.fail(function() { alert('request failed'); });
Live demo: http://jsfiddle.net/NLDYf/5/
Это поведение является частью интерфейса jQuery.Deferred.
В основном это позволяет присоединять события к асинхронному действию после вызова этого действия, а это означает, что вам не нужно передавать функцию события в действие.
Подробнее о jQuery.Deferred здесь: http://api.jquery.com/category/deferred-object/
Ответ 3
Да, он встроен в jQuery. См. Документы в jquery documentation.
ajaxError может быть тем, что вы хотите.
Ответ 4
Я считаю, что то, что вы ищете, это параметр ошибки для jQuery объект ajax
getJSON является оберткой для объекта $.ajax
, но он не предоставляет вам доступ к опции ошибки.
EDIT:
dcneiner дал хороший пример кода, который вам нужно будет использовать. (Еще до того, как я смогу опубликовать свой ответ)
Ответ 5
Я предпочитаю этот подход, потому что вы можете вернуть обещание и использовать .then(successFunction, failFunction); где вам нужно.
var promise = $.ajax({
type: 'GET',
dataType: 'json',
url: url,
timeout: 5000
}).then(function( data, textStatus, jqXHR ) {
alert('request successful');
}, function( jqXHR, textStatus, errorThrown ) {
alert('request failed');
});
//also access the success and fail using variable
promise.then(successFunction, failFunction);