javascript - 有什么方法可以只设置 meteor 发布的一个实例吗?

标签 javascript meteor collections publisher meteor-publications

我正在尝试为我的 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 都会在服务器和客户端内存中创建一个新文档。这样您将只管理一个文档并相应地对更改使用react。

关于javascript - 有什么方法可以只设置 meteor 发布的一个实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56811579/

相关文章:

javascript - 按住启动屏幕和启动屏幕

javascript - 从数组中的对象访问单个字段

ruby-on-rails - 使空白参数[]为零

delphi - 自上而下迭代通用集合(TDictionary)

javascript - 如何通过javascript SDK在facebook上上传照片

javascript - 现有 HTML 中的 ReactJS

javascript - 如何使用 LESS 在 vue/webpack 中创建主题

meteor - Iron-router 在渲染之前等待 Collection.findOne() 作为数据对象

java - 如何使用 webdriver 获取元素的所有后代?

javascript - Javascript/jQuery 中的 Python 部分等价物