当我收到WebSocket消息时,我会使用new Notification("Hello world!");
显示包含已解析数据的通知。
这很好用。问题是,当我打开多个选项卡时,我会多次收到通知 - 每个打开脚本运行的选项卡一次。
我想过设置一个cookie / LocalStorage,但这会遇到竞争条件。另一种可能性是在单身人士中进行通知,但由于标签彼此隔离,没有简单的方法可以做到 - 或者在那里?
// This doesn't work - still getting duplicate notifications
if ($.cookie("already-notified-" + event.id) != null)
return;
$.cookie("already-notified-" + event.id, true);
new Notification("Hello world!");
如何确保没有重复的通知?
答案 0 :(得分:1)
只要它来自同一个域,您就可以在选项对象中使用notification tags。它看起来像这样:
new Notification('Test Notification', {
tag: 'tagname'
});
从技术上讲,这不会阻止多次通知,而是取代现有通知。如果你同时有几个火,它看起来像一个通知,如果它们交错几秒钟,它可能看起来像一个扩展通知,或者像几个。但是,由于之前的通知已被删除,因此它们不会叠加,并且只有一个通知完成后才能通知。
小心使用此功能,因为您可能会发现在第一组之后通知停止发生。如果发生这种情况,您需要将renotify: true
添加到选项对象。这是因为计算机认为"我已经发送了域的通知:stackoverflow.com-tag:tagname ,我不需要发送另一个。" renotify
默认为false
,因此将其更改为true
可解决问题。
由于您似乎在代码中使用了事件ID(这会更改标记),您可能不会遇到此问题,但要注意这一点很好。
答案 1 :(得分:0)
毕竟,解决我的问题的方法很简单;只是不完全是我的想法。我非常专注于客户端解决方案,尽管(在我的情况下)在服务器端进行一些小技巧要简单得多。
我所做的是将连接存储在dict中,用户名作为键,IP和端口的组合列表作为值,有点像这样:
{
"linkD": [92.135.241.187:34214, 92.135.241.187:13245, 92.135.241.187:25313],
"amflare": [124.81.193.73:48239, 124.81.193.73:38293],
}
由于每个新的WebSocket连接都是通过不同的端口处理的,因此我可以简单地将任何新连接追加到列表中,并且仅向最新(列表中的最后一个)WebSocket发送通知。 断开连接后,连接将从列表中删除。