首页 > 解决方案 > 有什么方法可以设置一个流星发布的实例吗?

问题描述

我正在尝试为我的流星应用程序实现我自己的自定义乒乓球(流星有一个为内部使用而实现的乒乓球,但我想引入一个自定义行为)。我发现向客户端发送数据的唯一方法是使用发布者,因此我设置了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);
  });
}

标签: javascriptmeteorcollectionspublishermeteor-publications

解决方案


每个发布都单独处理,但您只能创建一个间隔并让它更新发布句柄列表:

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都是在服务器和客户端内存中创建一个新文档。这样,您将只管理一个文档并相应地对更改做出反应。


推荐阅读