【问题标题】:jquery php long polling request issuejquery php长轮询请求问题
【发布时间】:2012-01-13 10:49:02
【问题描述】:

我正在使用 PHP 和 jQuery 进行基于长轮询(类似于 this )的聊天。一旦在浏览器中下载了整个页面,一个函数会向后端发出一个带有超时限制的长轮询请求,当数据来自后端时,它会再次发出长轮询请求,如果有任何错误,它将再次发出新的长轮询请求。

问题:通过 firebug 分析跟踪,我注意到有时长轮询请求运行 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;
}

【问题讨论】:

  • 请您发布启动长轮询的代码吗?
  • 编辑了问题,代码包含在其中。

标签: php ajax jquery long-polling


【解决方案1】:

试试terminate requests manualy:

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

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

也可能是 Firefox/firebug 问题(显示中止的连接正在运行),请在 Chrome 中测试。

更新:

“仅在 Firefox 3.0+ 中,脚本和 JSONP 请求不能因超时而取消;即使脚本在超时期限之后到达,它也会运行。” http://api.jquery.com/jQuery.ajax/

【讨论】:

  • 在代码中是否有任何方法可以让代码检查是否存在正在运行的请求,然后该函数将返回,否则该函数将被调用?
  • 您可以使用 connection 变量作为标志来检查是否有任何 ajax 请求正在运行,如果是则不允许创建新请求。只需在complete函数中设置connection = undefined;,如果connection != undefined,则在longpoll函数开头设置return
  • 是的,你是对的。这是一个 firebug / firefox 问题,chrome 不显示多个待处理的请求。谢谢你的建议。节省了我的时间:)
猜你喜欢
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
相关资源
最近更新 更多