关于jquery:失败后重做Ajax调用

Redo an AJAX call after failure

我正在使用我可用的RESTAPI服务访问我的网站,该服务允许我首先进行身份验证,然后使用该身份验证的会话返回值执行进一步的API调用。我可以很好地访问它,没有任何问题。一小时后会话超时。假设我想在一小时后进行一次API调用,我想重新验证并继续进行最初发生的Ajax调用。你能告诉我如何重新进行一个Ajax调用吗?如果会话超时,该调用将首先进行身份验证,然后继续最初的Ajax调用?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$.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调用?

编辑:基本上,我有两个Ajax调用,一个用于获取会话ID的身份验证,另一个用于基于该会话ID返回一些数据。如果会话ID中途过期,我想重新进行身份验证调用,然后继续执行将首先发生的Ajax调用。关于我如何实现这一点有什么建议吗?

我还添加了一个它的图表,只是为了展示我想要实现的目标。

Scenario

干杯。


[我不明白"失败后"对你意味着什么,但通过以下内容,你将了解行动路线以及如何处理你的问题]

您可以将Ajax调用包装在一个函数中,如果是一个错误,可以再次调用它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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调用有一个超时参数,您可以这样做。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  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();
            }
        }  
    });

正如我在一个类似的答案中看到的,必须添加:

Set a timeout (in milliseconds) for the request. This will override
any global timeout set with $.ajaxSetup(). The timeout period starts
at the point the $.ajax call is made; if several other requests are in
progress and the browser has no connections available, it is possible
for a request to time out before it can be sent. In jQuery 1.4.x and
below, the XMLHttpRequest object will be in an invalid state if the
request times out; accessing any object members may throw an
exception. In Firefox 3.0+ only, script and JSONP requests cannot be
cancelled by a timeout; the script will run even if it arrives after
the timeout period.

假设您在某些消息中编写了异常,我们将在success函数中捕获异常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 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调用:如何使用jquery承诺链接三个异步调用?

这是我在ASP.NET中采用的某种体系结构[我不太了解您的服务器端语言]:ASP.NET MVC AJAX错误处理

Ajax错误处理和处理错误回调中的自定义异常:jquery Ajax错误处理,显示自定义异常消息


如果您由于某种原因,长时间断开连接,总是丢失会话信息,我建议您使用@razvandumitru建议的答案,但是如果您(以任何方式断开Internet连接)想要恢复所有会话信息,您需要在数据库中进行一些存储(将您的所有var打包为一些类似于json字符串的内容)和general。使用一些键进行识别,当您恢复会话并再次记录新的日志时,从数据库中读取所有var。

使用https://plugins.jquery.com/cookie/存储keyValue以在浏览器cookie中标识变量。

注意:如果您想要更多的安全性(显然需要以某种随机形式生成密钥),如果您愿意,可以使用一些公钥来保护它们。然后存储在浏览器中。您可以使用JavaScript代码或服务器脚本来完成所有这些工作。