Ren*_*aud 15 javascript polling long-polling
我进入了这些示例,显示了javascript中的轮询与长轮询,但我不明白它们之间的区别.特别是关于长轮询的例子,它如何保持连接打开?
这就是传统轮询方案的样子:
(function poll(){
setTimeout(function(){
$.ajax({ url: "server", success: function(data){
//Update your dashboard gauge
salesGauge.setValue(data.value);
//Setup the next poll recursively
poll();
}, dataType: "json"});
}, 30000);
})();
Run Code Online (Sandbox Code Playgroud)
这是长轮询的例子:
(function poll(){
$.ajax({ url: "server", success: function(data){
//Update your dashboard gauge
salesGauge.setValue(data.value);
}, dataType: "json", complete: poll, timeout: 30000 });
})();
Run Code Online (Sandbox Code Playgroud)
谢谢!
Rob*_*ert 25
不同之处在于:长轮询允许某种事件驱动的通知,因此服务器能够主动向客户端发送数据.正常轮询是定期检查要获取的数据,可以这么说.维基百科对此非常详细:
通过长轮询,客户端以类似于正常轮询的方式从服务器请求信息; 但是,如果服务器没有任何可用于客户端的信息,那么服务器不会发送空响应,而是保留请求并等待信息变为可用(或者对于合适的超时事件),之后完整的响应是终于送到了客户端.
长轮询减少了需要发送的数据量,因为服务器仅在存在IS数据时才发送数据,因此客户端不需要在每个间隔x进行检查.
如果您需要更高性能(并且更优雅)的全双工客户端/服务器通信方式,请考虑使用WebSocket协议,这太棒了!
最重要的事情没有在这里明确描述:长轮询是在服务器端实现的。
这就是为什么长轮询和轮询的 Javascript 代码看起来几乎相同——客户端实际上并没有做任何不同的事情。“此端点是立即响应还是等到有非空响应?”的实际实现 是驻留在您的网络服务器上的服务器端代码。
您的服务器决定何时响应。如果它决定有时会等待,那么这就是一个漫长的民意调查。
在内存中进行一些更改并返回的端点代码是常规轮询。
进行慢速 SQL 查询并在常规轮询后立即返回的端点代码。
检查消息队列,发现它是空的,让线程休眠一下,然后再次检查它直到队列中有东西的端点代码是长轮询。
无论如何,客户只是等待。
在“常规”轮询中,响应通常会很快返回 - 由延迟以及服务器处理请求所需的时间决定。
在“长”轮询中,如果服务器只需要短暂等待直到有东西可以响应,那么响应仍然可以很快返回。但这也可能需要一段时间,因为服务器愿意推迟其响应,以便可以响应一些有用的内容。
从客户的角度来看,基本上是一样的。它发送一个请求,并在某个时刻得到响应。对于长轮询,时间可能会长一些,但也不一定。
请注意,连接可能会超时,因此示例代码不会在生产中使用。您需要对超时和错误响应进行一些处理,通常只是重试请求。
| 归档时间: |
|
| 查看次数: |
11330 次 |
| 最近记录: |