在客户端实现彗星

问题描述:

我试图在我的应用程序中实现彗星,并且对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?是否有一个(简单,轻量级)库可用,为我实现一个线路接收器?

我希望听到关于现有的库如何自己实现这一点,因为迄今为止我已经与彗星库有坏运气,在这一点上,我希望只写代码我需要而且不必担心整个图书馆。

看过其他一些Comet/jQuery问题后,我偶然发现了这个:http://code.google.com/p/jquerycomet/,它看起来像是一个jQuery插件,可以完成您的工作。如果你想看看它是如何工作的,我只需挖掘源代码。

我发现一些很棒的信息的问题是here

+0

太棒了,谢谢 – 2010-10-06 18:09:43

+3

该项目现在看起来完全死了。 – 2011-04-13 18:28:42

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

我已经尝试了这种方法,但我希望能够将数据写入传输,而不是重新发起如此多的请求。这会让它更容易传递一个对象而不是重新接收请求,重新验证它,重新将它添加到列表中,等等。 – 2010-10-06 18:19:56

+0

@tvanfosson你能否详细说明这种方法的有用性?与“无限iframe”技术相比,我没有看到此解决方案的任何好处。 – Pacerier 2012-07-03 02:54:31

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

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