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

时间:2012-06-15 04:43:13

标签: 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
                    }
        });

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

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

6 个答案:

答案 0 :(得分:6)

试试这个:

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

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

然后武装你的.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!");
        } 

    });

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

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

答案 1 :(得分:3)

如果您的服务器不是很拥挤,那么当您开始传输数据时,可能会使用计时器开始定期检测连接(通过使用另一个ajax调用,例如每5秒)。现在你可以使用超时。

顺便说一下, 1)超时并不总是意味着网络错误。有时服务器的关闭也会导致“超时”

2)如果驱动程序在客户端设备上关闭,xhr.status = 0,并且没有超时

答案 2 :(得分:2)

我遇到了类似你的情况并通过每5秒进行一次网络检查来修复它,如果网络断开,我会手动中止ajax请求,这将结束ajax请求。

这里我在Jquery ajax调用的beforeSend事件中获取了ajax XmlHttpRequest,并在网络出现故障时使用该对象中止ajax请求。

var interval = null;
var xhr = null;

$.ajax({
     beforeSend: function(jqXHR, settings) {  
          xhr = jqXHR;  // To get the ajax XmlHttpRequest 
     },
     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
                },
      complete: function(data)
                {
                    alert('Complete');
                    //To clear the interval on Complete
                    clearInterval(interval);
                },
    });

interval = setInterval(function() {
    var isOnLine = navigator.onLine;
        if (isOnLine) {
            // online
        } else {
             xhr.abort();
        }
     }, 5000);

答案 3 :(得分:2)

我有一个类似的问题并用simpel try / catch和重试延迟(比方说)2秒来解决它:

function myAjaxMethod()
{
  try 
  {
    $.ajax({ ... });
  } catch (err) 
  { 
    console.log(err.message); 
    setTimeout(function(){myAjaxMethod(),2000});
  }
}

答案 4 :(得分:0)

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

还要确保设置cache:false,有时会有所帮助。

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

您将获得更多信息!

我的想法[更新]

@ RiteshChandora,我理解你的担忧。我怎么能建议你做两件事。

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

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

  3. json数据包含有关用户的敏感信息,他将其发布在没有SSL加密的网址上。

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

  5. 我建议的解决方案:在用户通过身份验证后,在服务器端检索他的好友列表。在服务器端执行任何操作,并在用户屏幕上显示结果。

    这样一来,您的服务器将承担所有负担,用户也无需在您的网址上发布任何令人讨厌的json帖子。

    顺便说一下,你的app想法很酷。

答案 5 :(得分:-5)

   error: function(xhr, textStatus, thrownError)
                    {
                       alert(xhr.status);
                       alert(thrownError);
                       alert(textStatus);

                    }

试试.. TextStatus(除了null)是“超时”,“错误”,“中止”和“parsererror”。 发生HTTP错误时,thrownError会收到HTTP状态的文本部分,例如“Not Found”或“Internal Server Error”。

如果互联网断开连接,则不会收到响应,并且最大值将是超时消息..