Comet(长轮询)和XmlHttpRequest状态

时间:2010-04-12 19:05:06

标签: javascript ajax xmlhttprequest comet long-polling

我正在玩一些原始的XmlHttpRequestObjects + 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()调用包装在一个检查status > 0的if语句中,因为我遇到了,当我离开页面时(通过浏览其他地方或重新加载它),最后一个不必要的彗星电话被发送。 [并且在Firefox上,它甚至在进行页面重新加载时会导致严重的问题,由于某些原因我还不完全理解。]

问题status是否检查了处理此问题的正确方法,还是有更好的解决方案?

2 个答案:

答案 0 :(得分:3)

我目前的答案 - 直到被证明是错误的 - 是解决方案是正确的。

答案 1 :(得分:0)

我喜欢这个循环的简单性....我认为服务器端脚本必须睡眠或至少循环,直到它在考虑长轮询之前获得新数据,尽管这只是正常轮询。我还会添加一些东西来检查请求是否失败。在try catch bloch中包装它应该可以解决问题