限制AngularJS聊天室中消息的最佳方法是啥

Posted

技术标签:

【中文标题】限制AngularJS聊天室中消息的最佳方法是啥【英文标题】:What's the best way to limit the messages in an AngularJS Chatroom限制AngularJS聊天室中消息的最佳方法是什么 【发布时间】:2014-05-14 12:29:01 【问题描述】:

好的,设置如下:

构建一个实时 AngularJS 聊天应用程序。但是,我想限制用户通过 API 调用看到的消息,该 API 调用确定他们附近的其他消息。

出于某种原因,我无法理解这一点。我探索了 socket.io、FireBase、PubNub,但我似乎无法想出一个好的方法来限制基于设置参数的 API 调用从这些服务返回的数据。

想法?

【问题讨论】:

见***.com/questions/19578303/…和amscotti.github.io/firebasemapexample/#。 【参考方案1】:

Proximity 的 Geohashing 聊天

立即尝试:Geohash Chat by Proximity

要按位置连接两个或更多人的组,您将采用纬度/经度值并降低精度分辨率,通过这样做您可以扩大邻近度的覆盖范围。您可以一次使用多个分辨率或固定分辨率。

获取源代码:GitHub Repository for Geo Chat by Proximity

地理散列的基础知识

接下来我们将介绍一些用于地理散列纬度/经度坐标的源代码 sn-p。通过降低浮点值的准确性来增加纬度/经度位置的半径是相当简单的。使用它,您可以扩大圆圈并收集纬度/经度。

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// Geo Hash
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
function geohash( coord, resolution ) 
    var rez = Math.pow( 10, resolution || 0 );
    return Math.floor(coord * rez) / rez;

地理散列分辨率“缩放”

“缩放”级别,基本上是几个不同的笛卡尔网格,粒度越来越大。一旦地理围栏事件触发,您将发布到与每个缩放级别对应的一组通道。缩放级别很重要,因为这是我们实际构建地理围栏和 PubNub 之间链接的方式。缩放级别是笛卡尔坐标 Lat/Long 的分辨率/去分辨率(想想 X,Y 坐标)。通过降低纬度/经度坐标的分辨率,我们可以构造一个匹配网格 1 个框的通道名称。分辨率越低意味着框越大,并且需要确定关联的 PubNub 频道。

// Create Proximity Channel
channel = geohash( pos.latitude, 0 ) + '' + geohash( pos.longitude, 0 );

这将创建一个非常宽的圆圈并生成一个用于连接的频道名称。接下来使用此频道名称连接到 PubNub。

// Connect to Proximity Channel
pubnub.subscribe(
     channel : channel,
     message : receive,
     connect : ready,
    presence : presence
);

复用 9 个盒子

您将计算周围的正方形,以提供更精确的方式扩展锥度和半径。这将消除“围栏”效果。

使用 PubNub 进行地理散列结论

就是这样!您只需降低地理坐标的分辨率并将其用作 PubNub 上的频道名称。另请查看浏览器的 navigator.geolocation.getCurrentPosition(...) 方法以在 chrome/firefox/ie/opera/mobile/safari 浏览器中获取 lat/long。

还可以查看PubNub Connected Car Solution Kit

【讨论】:

这是一个聪明的解决方案并且效果很好,但是它将盒子视为栅栏,而不是用户。因此,用户只会连接到他们盒子内的人,而不是将用户视为他们看到的消息的半径。因此,例如,如果用户 A 在 Box 1 的最左边缘,而用户 B 在相邻 Box 2 的最右边缘,即使他们彼此相邻,他们也不会在同一个聊天室。我理解正确吗? "Next-to" 是相对的。放大另一个级别,“next-to”变成“!next-to”。也许您可以将当前用户的级别/框分解为下一个级别的 9 个子框。 1)如果用户在中心框,只需使用当前框。 2)如果用户在“右中心”子框内,则包括右相邻的完整框。 3) 如果用户在“右上角”子框中,则包括上方、右上方和右上方的相邻完整框。这会有帮助吗? 您可以使用PubNub Multiplexing并连接到所有周围的8个盒子。 多路复用 9 个盒子 -- 您将计算周围的正方形,以提供更准确的方式扩展锥度和半径。这将消除“围栏”效果。

以上是关于限制AngularJS聊天室中消息的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

限制 API 命中的源 URL 的最佳方法是啥?

在这种情况下,在 AngularJS 中处理事件的最佳方法是啥?

使用 angularjs 播放 rtmp 流的最佳方法是啥?

为聊天应用程序缓存 apollo 客户端的最佳方式是啥?

创建 AngularJS ACL 的最佳方法是啥? [关闭]

在 AngularJS 中有条件地应用属性的最佳方法是啥?