Я пытаюсь реализовать систему повторных попыток ajax-запросов, которые не срабатывают по временной причине. В моем случае речь идет о повторном запросе запросов с кодом состояния 401, поскольку срок действия сеанса истек, после вызова обновленного веб-сервиса, который оживляет сеанс.
Проблема заключается в том, что "сделанные" обратные вызовы не вызываются при успешной повторной попытке, в отличие от вызываемого обратного вызова опции "успех" ajax. Я составил простой пример ниже:
$.ajaxSetup({statusCode: {
404: function() {
this.url = '/existent_url';
$.ajax(this);
}
}});
$.ajax({
url: '/inexistent_url',
success: function() { alert('success'); }
})
.done(function() {
alert('done');
});
Есть ли способ сделать обратные вызовы в стиле, вызванные успешной повторной попыткой? Я знаю, что отсроченный не может быть "разрешен" после того, как его "отвергли", можно ли предотвратить отказ? Или, может быть, скопировать сделанный список оригинала, отложенный до нового отложенного? У меня нет идей:)
Более реалистичный пример ниже, где я пытаюсь поставить в очередь все отклоненные запросы 401 и повторить их после успешного вызова/обновления.
var refreshRequest = null,
waitingRequests = null;
var expiredTokenHandler = function(xhr, textStatus, errorThrown) {
//only the first rejected request will fire up the /refresh call
if(!refreshRequest) {
waitingRequests = $.Deferred();
refreshRequest = $.ajax({
url: '/refresh',
success: function(data) {
// session refreshed, good
refreshRequest = null;
waitingRequests.resolve();
},
error: function(data) {
// session can't be saved
waitingRequests.reject();
alert('Your session has expired. Sorry.');
}
});
}
// put the current request into the waiting queue
(function(request) {
waitingRequests.done(function() {
// retry the request
$.ajax(request);
});
})(this);
}
$.ajaxSetup({statusCode: {
401: expiredTokenHandler
}});
Механизм работает, запросы с ошибкой 401 получают второй раз, проблема заключается в том, что их "сделанные" обратные вызовы не вызываются, поэтому приложения закрываются.