Ajax - 检查连接丢失

时间:2011-07-13 20:29:15

标签: javascript jquery ajax networking

我正在编写一个Web聊天应用程序。它使用长轮询机制。基本上,您向服务器发送请求,服务器保留它,直到有数据要发回。然后它响应,然后客户端向服务器发送另一个请求。循环重复。

然而,有一个问题 - 我没有错误检查到位。如果连接断开怎么办?假设我和朋友聊天然后我的Wifi掉线了。互联网瘫痪,让我们说它会在一分钟后恢复。但是,长期投票机制已经死亡,没有民意调查,我必须刷新页面。

如何实现错误检查机制来解决网络连接失败或丢失的问题?如果有帮助的话,我正在使用jQuery来促进Ajax请求。

* 编辑:这是我的轮询机制的JS代码:*

// Polls the server for more data, basically a regular encrypted request
Minte.Network.poll = function()
{
    // If client is not connected, do not send poll requests
    if (!Minte.Client.connected)
        return; 

    Minte.Network.request({ "action" : "poll"}, function(data) {

        // If a client has disconnected and a poll returns afterwards, do not process it
        if (!Minte.Client.connected)
            return;

        Minte.Network.lastPoll = Minte.clock.getTime(); 
        Minte.Processor.process(data); 
        Minte.Network.poll(); 
    }); 
}; 


// Send a regular, routine encrypted request
Minte.Network.request = function(data, callback) 
{

    $.post(SERVER_URI, data, function(data, textStatus, jqXHR) {
        data = JSON.parse(data); 
        callback(data); 
    }); 
}; 

1 个答案:

答案 0 :(得分:1)

首先,您可以挂钩ajax调用的错误处理。如果失败,您最终应该得到错误条件。由于我没有在任何地方看到这个定义,你可能需要找出一种方法来测试所有不同的浏览器在连接丢失时如何以不同的方式响应,看看这是否是你可以专门使用的东西。在任何情况下,钩住ajax失败响应都不会有害。您可能还希望实现自己的超时,这样如果您在xx时间内没有收到服务器的回复,那么肯定会出现某种问题。

其次,如果您想要更快的反馈,并且即使在不同的浏览器中也更可能保持一致,那么您可以让服务器返回心跳。因此,如果xx秒不活动,您的服务器将返回心跳响应。客户端将等待,xx + yy秒(yy是一些额外的,以允许往返时间和服务器响应中的任何轻微延迟),如果它没有收到来自服务器的实际数据报或心跳响应,那么它会假设连接已经死亡。如果它收到心跳,它只会再次发出请求。您可以将心跳设置为您想要的任何时间间隔,但显然短时间会对服务器基础结构造成负担。

仅供参考,jQuery有一个全局的ajax错误处理程序:http://api.jquery.com/ajaxError#callback和jQuery ajax调用本身允许你指定超时和错误处理程序。

在伪代码中:

$.ajax({
   url: 'xxxx',
   success: function(data, textStatus, jqXHR) {
      if (data is heartbeat) start a new ajax connection to ask again
      if (data has returned data in it) process it
   };
   error: function(jqXHR, textStatus, errorThrown) {
       some sort of connection error has happened
   };
   timeout: 2 * 60 * 1000;   // 2 minutes
});