2012-01-13 146 views
0

我正在基于长时间轮询(类似于this)与PHP和jQuery进行聊天。一旦整个页面被下载到浏览器中,一个函数会对后端发出长时间轮询请求,并有一些超时限制,当数据来自后端时,它会再次发出长轮询请求,如果有任何错误,它将再次创建新的长轮询请求。jquery php长轮询请求问题

问题:通过萤火虫分析跟踪,我注意到有些时候长轮询请求运行了3次或4次,但它不应该。每个页面只应运行一个长轮询请求。

但是代码完美地工作。但长轮询请求重复是问题。

function listen_for_message(){ 
// this functions is makes the long-polling request 
$.ajax({ 
    url: "listen.php", 
    timeout:5000, 
    success: function(data) { 
      $('#display').html(data); 
      listen_for_message(); 
      } 
    error: function() { 
      setTimeOut("listen_for_message()",2000); // if error then call the function after 2 sec 
    } 
    }); 
    return; 
} 
+2

请你可以发布你的代码,启动长轮询? – jabclab 2012-01-13 10:50:33

+0

编辑了包含在其中的代码。 – 2012-01-13 10:59:06

回答

1

尝试terminate requests manualy

var connection; 
function longpoll() { 
    if(connection != undefined) { 
     connection.abort(); 
    } 

    connection = $.ajax({ 
     ... 
     complete: function() { 
      longpool(); 
     } 
    }); 
} 

它也可以是一个Firefox /萤火问题(表示中止连接跑步),在浏览器对其进行测试。

UPDATE:

“在Firefox 3.0+只,脚本和JSONP请求不能被一个超时被取消;如果超时时间到达后脚本也会继续运行。” http://api.jquery.com/jQuery.ajax/

+0

好的建议让我检查铬 – 2012-01-13 11:07:44

+0

有没有办法在代码中做这样的代码将检查,如果有运行一个请求然后函数将返回其他函数将调用? – 2012-01-13 11:10:12

+0

您可以使用_connection_变量作为标志来检查是否有任何ajax请求正在运行,如果不是,则不允许创建新的。如果连接!=未定义,只需在'long'函数的开始处设置'connection = undefined;'在'complete'函数和'return'中。 – 2012-01-13 11:18:17