【问题标题】:Implementing comet on the client side在客户端实现彗星
【发布时间】:2011-04-21 23:45:04
【问题描述】:

我正在尝试在我的应用程序中实现 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?是否有可用的(简单、轻量级)库为我实现线路接收器?

我希望了解现有的库如何自己实现它,因为到目前为止我在彗星库上运气不佳,此时我希望只需编写我需要的代码,而不用为整个库而烦恼。

【问题讨论】:

    标签: javascript jquery comet


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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 );
                }
             }
       }
      

      【讨论】:

      • 我实际上已经尝试过这种方法,但我希望能够只将数据写入传输而不是重新启动这么多请求。与重新接收请求、重新验证、重新添加到列表等相比,传递对象要容易得多。
      • @tvanfosson 你能详细说明这种方法的用处吗?与“无限 iframe”技术相比,我看不出这种解决方案有什么好处。
      【解决方案3】:

      在查看了一些其他 Comet/jQuery 问题后,我偶然发现了这个:http://code.google.com/p/jquerycomet/,它看起来是一个 jQuery 插件,可以满足您的需求。如果您想了解它是如何工作的,我会深入研究源代码。

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

      【讨论】:

      • 该项目现在看起来完全死了。
      猜你喜欢
      • 1970-01-01
      • 2011-12-28
      • 2011-07-19
      • 2013-02-09
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      相关资源
      最近更新 更多