Я пытаюсь реализовать систему повторных запросов 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');
});
Есть ли способ сделать обратные вызовы в стиле -, вызываемые при успешной повторной попытке? Я знаю, что отложенное не может быть «разрешено» после того, как оно было «отклонено», возможно ли предотвратить отклонение? Или, может быть, скопировать doneList исходного отложенного в новый отложенный? У меня нет идей:)
Более реалистичный пример ниже, где я пытаюсь поставить в очередь все 401 -отклоненных запроса и повторить их после успешного вызова /refresh.
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 -запускаются во второй раз, проблема в том, что их обратные вызовы «done» не вызываются, поэтому приложения зависают.