Повторите запрос jquery ajax, к которому привязаны обратные вызовы

Я пытаюсь реализовать систему повторных запросов 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» не вызываются, поэтому приложения зависают.

37
задан BartoszKP 22 June 2014 в 23:07
поделиться