Javascript 在客户端实现comet

Javascript 在客户端实现comet,javascript,jquery,comet,Javascript,Jquery,Comet,我试图在我的应用程序中实现comet,由于缺乏JavaScript经验,我不知道如何在客户端实现comet 当服务器接收到请求时,它只是将其保持打开状态,并在必要时向其写入数据: def render_GET(self, request): print "connected" request.write("Initiated\r\n") reactor.callLater(random.randint(2, 10), self._delay, request) r

我试图在我的应用程序中实现comet,由于缺乏JavaScript经验,我不知道如何在客户端实现comet

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

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,但我不知道如何使它与服务器一起工作。没有一个回调会说“嘿!我刚收到一些数据!”,它们只会说“请求完成了。”

我认为
dataFilter()
函数正是我想要的,因为它允许您在请求完成之前处理原始数据,但它只允许您在请求完成之前处理原始数据,而不是在接收数据时处理原始数据

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


我希望了解一个现有的库以及如何自己实现它,因为到目前为止,我在comet库方面运气不好,现在我希望只编写我需要的代码,而不必担心整个库。

在看了一些其他comet/jQuery问题后,我偶然发现了这样一个问题:,这看起来是一个jQuery插件,可以实现您所追求的功能。如果你想知道它是如何工作的,我会深入了解它的来源


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

标准技术是通过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 );
          }
       }
 }

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

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);
  }
};

我确实尝试过这种方法,但我希望能够将数据写入传输,而不是重新启动这么多请求。与重新接收请求、重新验证请求、将其重新添加到列表等相比,只传递对象要容易得多。@tvanfosson您能详细说明这种方法的有用性吗?与“无限iframe”技术相比,我看不出这个解决方案有什么好处。这个项目现在看起来完全死掉了。