阻止AngularJS中的PubNub请求

时间:2013-08-21 18:21:15

标签: angularjs pubnub

我遇到了布莱恩·福特的这篇文章,其中谈到了限制Socket.io请求以帮助在大型应用程序中使用摘要 - http://briantford.com/blog/huuuuuge-angular-apps.html

我最近构建了一个工厂来支持PUBNUB的JS API,并且在JS中实现限制时遇到困难,以防止每次收到消息时应用/摘要都是hapenning。这是一个工作的Plunkr工作 - http://plnkr.co/edit/0w6dWQ4lcqTtdxbOa1EL?p=preview

我认为我遇到的主要问题是理解Brian的示例如何处理Socket.io的语法,以及它如何应用于PubNub处理消息回调的方式。

谢谢!

1 个答案:

答案 0 :(得分:2)

AngularJS中的PubNub速率限制与限制消息

在深入研究解决方案之前,我们想谈谈rate limitingthrottling的潜在理想特征或行为的变化。首先,您可能需要限制更新UI的频率,或者调用 function()时的速率。

  

如果您想跳到plunker源代码:http://plnkr.co/edit/Kv698u?p=preview

rate limiting的行为将演示每秒最大消息数,并且在消息到达的速率触发的每个事件之间均匀分布延迟。您可以rate limit识别消息并将事件均匀分布在 X毫秒上,而不是通过管道中的费率消息触发所有事件。

然而,throttling的行为与rate limiting的行为不同,capping仅使用收到的最新消息而故意丢弃消息。节流是速率限制方法的又一步,并且完全排除了通过抛弃每条消息而识别的消息,并且只留下最近可用的消息以设定的间隔进行处理。

还有Capping的概念,它在一段时间内只允许x消息到达,然后暂停事件直到完成时间。 // // Listen for messages and process all messages at steady rate limit. // pubnub.subscribe({ channel : "hello_world", message : limit( function(message) { // process your messages at set interval here. }, 500 /* milliseconds */ ) }); // // Rate Limit Function // function limit( fun, rate ) { var queue = []; setInterval( function() { var msg = queue.shift(); msg && fun(msg); }, rate ); return function(message) { queue.push(message) }; } 与速率限制或限制不同,其中消息接收的速率与处理它们的速率相同,而不是在一个时间间隔内均匀分配每个事件。识别所有消息(超出配额后删除是可选的)。

AngularJS的Plunker JavaScript源编辑器

http://plnkr.co/edit/Kv698u?p=preview - 使用AngularJS绑定的代码视图。

  

使用Plunker预览工作示例!

AngularJS中的PubNub速率限制

此过程需要一个队列来接收和存储所有消息,直到它们以缓慢稳定的方式处理。此方法不会丢弃任何消息,而是以设定的速率慢慢地咀嚼每条消息,直到所有消息都被处理,无论网络接收速率如何。

limit()

请注意,感兴趣的函数是// // Listen for events and process last message each 500ms. // pubnub.subscribe({ channel : "hello_world", message : throttle( function(message) { // process your last message here each 500ms. }, 500 /* milliseconds */ ) }); // // Throttle Function // function throttle( fun, rate ) { var last; setInterval( function() { last !== null && fun(last); last = null; }, rate ); return function(message) { last = message }; } 以及如何在订阅调用的消息响应回调中使用它。

AngularJS中的PubNub限制

这是一个只会定期处理最新消息的过程,而有目的地删除在特定时间窗口内收到的所有旧消息。

throttle()

// // Listen for events and process last message each 500ms. // pubnub.subscribe({ channel : "hello_world", message : thrimit( function( last_message, all_messages ) { // process your last message here each 500ms. }, 500 /* milliseconds */ ) }); // // Throttle + Limit Function // function thrimit( fun, rate ) { var last; var queue = []; setInterval( function() { last !== null && fun( last, queue ); last = null; queue = [] }, rate ); return function(message) { last = message; queue.push(message); }; } 函数将丢弃在特定窗口中收到的消息,同时始终以设定的间隔处理最后收到的消息。

或两者结合

{{1}}