彗星(长轮询)和XmlHttpRequest状态

6
我正在尝试使用原始的XmlHttpRequestObject + Comet Long Polling技术进行一些调试。通常情况下,我会让GWT或其他框架来处理,但我想更多地了解这个技术。
我编写了以下代码:
function longPoll() {
  var xhr = createXHR(); // Creates an XmlHttpRequestObject
  xhr.open('GET', 'LongPollServlet', true);
  xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {

        if (xhr.status == 200) {
            ...
        }

        if (xhr.status > 0) {
            longPoll();
        }
    }
  }
  xhr.send(null);
}

...
<body onload="javascript:longPoll()">...

我在longPoll()调用中加入了一个if语句,它检查status > 0,因为我发现当我离开页面(通过浏览其他页面或重新加载页面)时,会发送最后一个不必要的comet调用。[而且在Firefox上,这甚至会在重新加载页面时引起严重问题,原因我还没有完全理解。]

问题:这个status检查是处理这个问题的正确方法吗?还是有更好的解决方案?


你不能只看一些现有的实现,比如你提到的GWT、jQuery等吗? - user65663
@fig-gnuton:我不确定生成的JavaScript代码是否真的很容易理解(我不是JavaScript大师……) - Chris Lercher
如果你已经足够了解如何使用原始的XHR,那么查看Jquery或其他库就不会有问题。它们有完全注释的源代码版本。 - user65663
@fig-gnuton:好的,我还没有找到这种类型的源代码 - 到目前为止我找到的源代码相当复杂,几乎100%没有文档。由于JavaScript本来就有让我发疯的潜力(我*沉迷于强类型等),我更喜欢一个足够深入涵盖这种问题的JavaScript彗星教程的链接,或者甚至是一个具体的答案。或者至少提供一些源代码的具体位置的链接。 - Chris Lercher
我不明白为什么你要测试 status > 0。毕竟,只有当请求完成时,onreadystatechange 函数才会被调用,并且 readyState == 4。你是如何看到“最后一个不必要的彗星调用被发送”的?而你所说的 Firefox 中的严重问题是什么?也许另一个答案中的测试用例对你有帮助(使用 jQuery,但本质上是相同的):https://dev59.com/p3E85IYBdhLWcg3wl0nF#2713567 - Marcel Korpel
显示剩余2条评论
2个回答

4

我目前的答案是,除非有证据证明错误,否则这个解决方案是正确的。


0
我喜欢这个循环的简洁性... 我认为服务器端脚本必须睡眠或者至少在获取新数据之前循环,才能称为长轮询,尽管这只是普通的轮询。我还会添加一些检查请求失败的内容。将其包装在 try catch 块中应该就可以了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接