有什么方法可以只设置流星发布的一个实例吗?

Is there some way to set just a instace of meteor publish?

我正在尝试为我的 meteor 应用程序实现我自己的自定义 ping-pong(meteor 实现了供内部使用的 ping-pong,但我想引入自定义行为)。我发现向客户端发送数据的唯一方法是使用发布者,所以我设置了一个 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 都会在服务器和客户端内存中创建一个新文档。这样您将只管理一个文档并相应地对更改做出反应。