6

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

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

4

2 回答 2

4

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

于 2010-06-08T07:18:46.860 回答
0

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

于 2013-06-26T06:04:38.167 回答