在客户端实施彗星

时间:2010-10-06 18:00:33

标签: javascript jquery comet

我正在尝试在我的应用程序中实现彗星,并且由于缺乏JavaScript经验,我不确定如何做客户端。

当服务器收到请求时,它只是保持打开状态并在必要时将数据写入其中:

def render_GET(self, request):
    print "connected"
    request.write("Initiated\r\n")
    reactor.callLater(random.randint(2, 10), self._delay, request)
    return NOT_DONE_YET;

def _delay(self, request):
    print "output"
    self.count += 1
    request.write("Hello... {0}\r\n".format(self.count))
    reactor.callLater(random.randint(2, 10), self._delay, request)

到目前为止,我一直在客户端使用jQuery,但我无法弄清楚如何使它与服务器一起工作。 I've been looking at the jQuery.AJAX documentation并且没有一个回调说“嘿!我刚收到一些数据!”,他们只说“请求已经完成”。

我认为dataFilter()函数是我想要的,因为它允许您在请求完成之前处理原始数据,但它只允许您在请求完成之前 执行此操作,并且不是因为你收到数据。

那么如何通过开放请求持续接收数据?正如您在python示例中所看到的,每条数据都以\r\n分隔,因此我希望JavaScript的行为类似于行接收器。这可能与jQuery或我必须直接使用XMLHttpRequest / ActiveXObject吗?是否有一个(简单,轻量级)库可以为我实现线路接收器?

我希望能够听到现有的库如何自己实现这个,因为到目前为止我的彗星库已经运气不好,而且此时我希望能够只需编写我需要的代码,而不必担心整个库。

3 个答案:

答案 0 :(得分:2)

在查看了其他一些Comet / jQuery问题之后,我偶然发现了这个:http://code.google.com/p/jquerycomet/,它看起来像是一个jQuery插件,可以完成你所追求的目标。如果你想看看它是如何工作的,我只想深入了解它。

我发现一些重要信息的问题是here

答案 1 :(得分:2)

标准技术是通过AJAX执行长轮询请求(标准调用具有非常长的超时),然后在接收响应时,您的回调会在调用时启动另一个长轮询。如果超时到期,则使用错误处理机制重新发出请求。而不是只有一个长期请求定期执行某些操作(如“无限iframe”技术),而是使用一系列长请求来获取数据,因为服务器可以使用它。

 function longPoll( url, data, cb )
 {
       $.ajax({
          url: url,
          data: data,
          timeout: Number.MAX_VALUE,
          ...other options...
          success: function(result) {
               // maybe update the data?
               longPoll( url, data, cb );
               cb.call(this,result);
          },
          error: function() {
               longPoll( url, data, cb );
          }
       }
 }

答案 2 :(得分:0)

这段代码是我见过的最简单的代码。

var previous_response_length = 0
  , xhr = new XMLHttpRequest();

xhr.open("GET", "http://127.0.0.1:7379/SUBSCRIBE/hello", true);
xhr.onreadystatechange = checkData;
xhr.send(null);

function checkData() {
  if(xhr.readyState == 3) {
    response = xhr.responseText;
    chunk = response.slice(previous_response_length);
    previous_response_length = response.length;
    console.log(chunk);
  }
};