如何检测网络断开导致的Ajax呼叫失败

Rit*_*ora 18 javascript ajax jquery

我使用jquery ajax方法向web服务器发送大量数据,客户端只在收到服务器的确认后才响应,现在假设网络连接在ajax调用的MIDDLE中丢失,那么如何检测这种情况.

$.ajax({
         url:'server.php',
         data:'lots of data from 200KB to 5MB',
         type:'post',
         success: function(data)
                    {
                        alert('Success');
                      //some stuff on success

                    },
          error: function(XMLHttpRequest, textStatus, errorThrown)
                    {
                        alert('Failure');
                      //some stuff on failure
                    }
        });
Run Code Online (Sandbox Code Playgroud)

这是我的代码,如果让互联网断开连接,它在ajax调用中间不会出错.

注意:我无法使用超时,因为数据大小从200kb到5MB不等,服务器响应时间计算不可行.

Dar*_*sVE 6

试试这个:

首先每隔5秒用setInterval创建一个"ping"ajax调用

function server_ping()
    {
        $.ajax({
            url:"url to ping",
            type: "POST"
        });
    }
    var validateSession = setInterval(server_ping, 5000);
Run Code Online (Sandbox Code Playgroud)

然后武装你的.ajaxError陷阱:

$(document).ajaxError(function( event, request, settings ) {
        //When XHR Status code is 0 there is no connection with the server
        if (request.status == 0){ 
            alert("Communication with the server is lost!");
        } 

    });
Run Code Online (Sandbox Code Playgroud)

记住Ajax调用默认是异步的,所以当ping进入服务器并且请求无法到达服务器时,XHR状态的值为0,并且.ajaxError将触发,你必须捕获错误并处理你的方式想要它.

然后,您可以将数据发送到服务器,如果在发送数据时连接丢失,则会收到ping报告的错误.


Esw*_*ala 0

尝试在构建 $.ajax({}) 时添加 timeout: 。

还要确保设置cache: false,有时很有用。

参考Jquery的ajax():http://api.jquery.com/jQuery.ajax/#toptions

您将在那里获得更多信息!

我对你的问题的看法[更新]

@RiteshChandora,我理解你的担忧。我可以建议你做两件事。

  1. 由于您发布的数据范围为 200kb 到 5mb,因此您可能需要选择最大超时。并触发相同的操作。是的,这可能会有问题,但根据您选择的设计,监视 POST 进度的唯一方法就是这样做。如果没有,请参见第 2 点。

  2. 我经历了流程,您要求用户将响应 Json 从 FB 复制到您的网址。这里有一些问题,

  3. json 数据包含有关用户的敏感信息,并且他将其发布到未经 SSL 加密的 URL 上。

  4. 为什么要提示用户将获取的数据发布到您的服务器上?如果您使用服务器端脚本,应该会更容易。另外,在这种情况下,您不应该将大量数据从客户端发布到服务器,您可以在服务器端从 FBserver->您的服务器检索相同的表单。

我建议的解决方案:用户通过身份验证后,在服务器端检索他的好友列表。在服务器端做任何你想做的事情,并将结果显示在用户屏幕上。

这样所有的负担都将由你的服务器承担,用户也不需要在你的 url 上发布任何令人讨厌的 json 内容。

顺便说一句,你的应用程序想法很酷。