首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >失败后重做AJAX调用

失败后重做AJAX调用
EN

Stack Overflow用户
提问于 2015-05-12 16:02:59
回答 2查看 4K关注 0票数 15

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

代码语言:javascript
运行
复制
$.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调用。对于我如何做到这一点,有什么建议吗?

我还添加了一张图表,以显示我想要实现的目标。

干杯。

EN

回答 2

Stack Overflow用户

发布于 2015-06-09 16:05:51

我不明白“失败后”对你意味着什么,但从以下几个方面你就会明白行动路线,以及如何处理你的问题

您可以将ajax调用包装在一个函数中,并在发生错误时再次调用它。

代码语言:javascript
运行
复制
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调用有一个超时值参数,您可以这样做。

代码语言:javascript
运行
复制
  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+请求不能被超时取消;即使它在超时期间之后到达,脚本也会运行。

让我们假设您是在某个消息中写入异常,然后我们将在成功函数中捕获异常。

代码语言:javascript
运行
复制
 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调用链接:How do I chain three asynchronous calls using jQuery promises?

这是我在asp.net中采用的某种体系结构,我并不真正了解您的服务器端语言:ASP.NET MVC Ajax Error handling

Ajax错误处理和处理错误回调中的自定义异常:jQuery Ajax error handling, show custom exception messages

票数 11
EN

Stack Overflow用户

发布于 2015-06-15 17:46:05

如果您由于某种原因而丢失了连接很长时间,总是丢失您的会话信息,我建议您使用@RazvanDumitru建议的答案,但是如果您(以任何方式丢失了您的互联网连接)并且希望恢复您的所有会话信息,您需要在数据库中存储一些数据(将所有的var打包成json-string)并生成一些键来识别,当您恢复您的会话并重新重新记录时,请从db中读取所有的vars。

使用https://plugins.jquery.com/cookie/存储键值,以在浏览器cookie中标识您的vars。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30196073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档