2009-12-08 115 views

回答

1

是的,只需要使用第二个连接到服务器。这是大多数框架所做的,包括iirc Bayeux protocol。如果你发现你确实需要第二个连接,那么就担心它。

下面是从我的链接修改上面的一些长轮询代码:

var userid = Math.ceil(1000000*Math.random()).toString(16).toUpperCase(); 
var startLongpoll = function() { 
    $.ajax({ 
     type:"POST", async:true, cache:false, timeout:0, 
     data: {userid: userid}, 
     success: function(data){ 
      _outCallback(data); 
      setTimeout(startLongpoll, 10); 
     }, 
     error: function(xhr, textStatus, errorThrown){ 
      _errCallback(textStatus+" ("+errorThrown+")"); 
      setTimeout(startLongpoll, 5000); 
     }, 
    }); 
}; 
setTimeout(startLongpoll,10); 

什么Moishe与队列谈论的是JS不保证XHR时将在订单中收到了所派出他们。这些消息不会丢失(或者至少它们没有在我的测试中),这不是一个特定的长轮询问题,而是当您使用xhr发送时需要考虑的一些问题。

因此,这里的队列代码:

var queue = []; 
var busy = false; 
this.send = function(msg) { 
    queue[queue.length] = msg; 
    if (busy) return; 
    busy=true; 
    var s = function() { 
     var m = queue.shift(); 
     $.ajax({ 
      type:"POST", async:true, cache:false, timeout: 5000, 
      data: {userid:userid, msg:m}, 
      error: function(xhr, textStatus, errorThrown){ 
       _errCallback(textStatus + " (" + errorThrown + ")"); 
       if (queue.length>0) s(); else busy = false; 
      }, 
      success: function(){ 
       if (queue.length>0) s(); else busy = false; 
      } 
     }); 
    } 
    s(); 
}; 

有两点需要注意。首先,如果你发送很多消息并且队列正在填满,那么会有一些滞后。最好找到一种方法来发送整个队列,而不是一个一个地发送。一种方法是将消息转换为JSON数组,并在服务器上解码。

其次,如果发送消息时发生错误,那么您已经丢失了该消息。需要有一些代码将推送失败的消息返回到队列中,或者直到成功才将其删除。

1

只需使用XHR做一个POST。

一个问题是,在某些浏览器中,每个服务器只能有2个(或n个)并发XHR连接。您可以通过创建一个队列来解决这个问题,该队列允许您在当前XHR完成时发布所有正在等待的消息,然后填充新的队列,直到该帖子完成,然后来回。

+0

长轮询可能需要10秒或更长时间 - 这是等待将某些内容发送到服务器的很长时间。我假设一些流行的框架已经解决了这个问题 - 但是如何? (右侧,每个服务器每个标签有2个连接,因为一个是轮询,第二个是服务器xhr,图像,样式表等等。) – 2009-12-08 07:58:58

+0

你需要一个异步XHR。然后,在等待完成时,您可以创建另一个(异步或不是,这取决于您)XHR将数据发布到服务器。如果第二个XHR *为* async,则需要实施一些排队功能,以便在第二个XHR进行时不会丢失要发布的消息。 – 2009-12-08 17:36:59

+0

如果您发送超出2连接限制的异步xhr,我认为您不会丢失消息。你的意思是在服务器上排队吗? – 2009-12-10 00:20:13

1

发送数据到服务器只是一个标准的请求。 Xhr很好,或JSONP,无论漂浮你的船。

不要被长轮询弄糊涂;长轮询仅作为从服务器发送到客户端的一种方式存在。从客户端发送数据到服务器是Web自成立以来一直在发生的事情,并且正常的Xhr请求是您所需要的。

相关问题