javascript - 有什么方法可以设置一个流星发布的实例吗?
问题描述
我正在尝试为我的流星应用程序实现我自己的自定义乒乓球(流星有一个为内部使用而实现的乒乓球,但我想引入一个自定义行为)。我发现向客户端发送数据的唯一方法是使用发布者,因此我设置了setInterval
, 以发送带有 pong 时间戳的新有效负载,但在每个新订阅中都会创建一个新的setInterval
. 我怎么能只设置一个发布或 setInterval?还是有其他方式向客户发送消息?
const COLLECTION_NAME = 'ping-pong';
const POLL_INTERVAL = 5000;
function pingPong(credentials) {
const pongSender = () => {
const id = _.uniqueId('pong-');
const payload = {
message: 'pong',
time: Date.now(),
};
this.added(COLLECTION_NAME, id, payload);
};
pongSender();
this.ready();
const interval = Meteor.setInterval(pongSender, POLL_INTERVAL);
this.onStop(() => {
Meteor.clearInterval(interval);
});
}
解决方案
每个发布都单独处理,但您只能创建一个间隔并让它更新发布句柄列表:
const pingPongSubscribed = [];
const pingPongIntervalId = setInterval(() => {
pingPongSubscribed.forEach(handle => {
// ...
handle.added(COLLECTION_NAME, DOCUMENT_ID, payload);
});
}, 5000);
// ...
Meteor.publish('example', function () {
// ...
pingPongSubscribed.push(this);
this.onStop(() => {
pingPongSubscribed.splice(pingPongSubscribed.indexOf(this), 1);
});
});
如果您需要更多数据,只需将其保存在pingPongSubscribed
. 请记住,它将在与一台服务器的连接方面同步,并且多个服务器实例不同步。
另外,请考虑changed
改用。每次使用added
都是在服务器和客户端内存中创建一个新文档。这样,您将只管理一个文档并相应地对更改做出反应。
推荐阅读
- list - 从另一个列表的元素创建大小为 N 的排列列表
- javascript - 为什么 Twilio 和 Firebase 不能使用 Node.js 协同工作?
- scala - 在 Spark Scala 中将时间戳转换为 UTC
- php - 如何在 Windows 服务器上的 php 中不阻塞进程?
- mysql - SQL 查询 - 在查询方面需要一些帮助
- swift - AudioKit 4.2 将自定义音序器连接到 AKMIDISampler 的端点
- javascript - 在 Javascript ES6 中调整窗口大小问题
- asp.net - 使 ASP 标签成为本地服务器上文档的可点击链接
- c# - 如何让程序显示它正在使用的资源?
- vba - 从 VBA 进行 UTF-8 调用