Повторить вызов AJAX после сбоя

Я обращаюсь к своему сайту с помощью имеющейся у него службы REST API, которая позволяет мне сначала пройти аутентификацию, а затем использовать это возвращаемое значение сеанса аутентификации для выполнения дальнейших вызовов API. Я могу получить доступ к нему нормально и правильно, без каких-либо проблем. Сессия заканчивается через час. Допустим, я хотел бы сделать вызов API через час, я хотел бы повторно проверить подлинность и продолжить вызов AJAX, который происходил в первую очередь. Не могли бы вы предложить мне, как я могу повторить вызов AJAX, который будет сначала проверять подлинность, если сеанс исчерпан, а затем продолжить исходный вызов AJAX, который был там в первую очередь?

$.ajax({
    type: "GET",
    dataType: "json",
    url: "url",
    cache: false,
    async: false,
    success: function (data) {
        alert(data);
    },
    error: function(xhr, textStatus, errorThrown) {
        //$.ajax(this);
        //return;
    },
    statusCode: {
        403: function() {
            var session = retryLogin();
            if(session !== "")
            {
             // call this function again? How can we achieve this?????
            }

        }
    }
});

Пожалуйста, дайте мне знать, как я могу снова вызвать этот вызов ajax, который должен был запускаться в первую очередь?

EDIT: В основном у меня есть два вызова AJAX, то есть один для аутентификации, который получает идентификатор сеанса, а другой - для получения некоторых данных на основе этого идентификатора сеанса. Если идентификатор сеанса истекает в середине пути, я хотел бы повторить вызов аутентификации, а затем продолжить с вызовом AJAX, который должен произойти в первую очередь. Любые предложения о том, как я могу это достичь?

Я добавил диаграмму, а также просто показать, чего бы я хотел достичь.

Scenario

Приветствия.

Ответы

Ответ 1

[Я не понимаю, что означает "после неудачи" для вас, но из следующего вы поймете направление действий и то, как вы можете приблизиться к своей проблеме]

Вы можете обернуть вызов ajax в функцию и вызвать его снова, если это ошибка.

var callMeAgain = function(){
$.ajax({
    type: "GET",
    dataType: "json",
    url: "url",
    cache: false,
    async: false,
    success: function (data) {
        alert(data);
    },
    error: function(xhr, textStatus, errorThrown) {
       callMeAgain();
       //text statuses for error are: "timeout", "error", "abort", and "parsererror"
    }   
});
};

Это то, чего вы пытаетесь достичь?

У вызова ajax есть параметр тайм-аута, и вы можете сделать что-то вроде этого.

  var callMeAgain = function(){
    $.ajax({
        type: "GET",
        dataType: "json",
        url: "url",
        cache: false,
        timeout: 400,
        async: false,
        success: function (data) {
            alert(data);
        },
        error: function(xhr, textStatus, errorThrown) {
            if (textStatus=="timeout") {
                    callMeAgain();
            }
        }   
    });

Как я вижу в подобном ответе, необходимо добавить, что:

Установите тайм-аут (в миллисекундах) для запроса. Это будет отменено любой глобальный таймаут, заданный с $.ajaxSetup(). Период таймаута начинается в точке вызывается вызов $.ajax; если еще несколько запросов прогресс и браузер не имеет доступных соединений, возможно для запроса тайм-аута перед его отправкой. В jQuery 1.4.x и ниже, объект XMLHttpRequest будет находиться в недопустимом состоянии, если время запроса; доступ к любому объекту может исключение. Только в Firefox 3.0+ запросы script и JSONP не могут быть отменяется таймаутом; script будет работать, даже если он поступит после период ожидания.

Предположим, вы пишете исключение в каком-то сообщении, и мы поймаем исключение в функции успеха.

 var sessionCallVar = function sessionCall () {
   return $.ajax(...);
};

 var callMeAgain = function(){
        $.ajax({
            ......
            success: function (response) {
                if(response.SessionExceptionMessage !== ''){
                    //then we have a session error
                    sessionCallVar().then(callMeAgain);
                  }
            },
            error: function(xhr, textStatus, errorThrown) {
                .........
            }   
        });

Цепочка вызовов ajax на основе promises: Как связать три асинхронных вызова с помощью jQuery promises?

И это какая-то архитектура, которую я обнимаю в asp.net [я действительно не знал о вашем серверном языке]: ASP.NET MVC Ajax Обработка ошибок

Обработка ошибок Ajax и обработка пользовательских исключений в обратном вызове ошибки: jQuery Обработка ошибок Ajax, отображение пользовательских сообщений об исключениях

Ответ 2

Если вы по какой-то причине потеряли соединение в течение долгого времени, всегда теряли информацию о сеансе, я рекомендую использовать ответ, предложенный @RazvanDumitru, но если вы (каким-то образом потеряли интернет-соединение) и хотите восстановить все ваша информация о сеансе, вам нужно сделать некоторое хранилище в базе данных (пакет всех ваших варов в некотором смысле, например json-string) и генерировать какой-то ключ для идентификации, а когда вы восстановите свою сессию и снова запишите новую, прочитайте все vars из db.

используйте https://plugins.jquery.com/cookie/, чтобы сохранить значение ключа для идентификации ваших варов в cookie браузера.

Примечание. Если вы хотите больше безопасности (очевидно, нужно создать ключ в какой-то случайной форме), и если хотите, защитите их каким-то открытым ключом. а затем сохранить в браузере. вы можете сделать все это с помощью javascript-кодов или серверных скриптов.