【问题标题】:Subscription in Tracker.autorun causes publish callback to fire multiple timesTracker.autorun 中的订阅导致发布回调多次触发
【发布时间】:2019-05-23 04:53:04
【问题描述】:

我在一个 ReactJS 和 Meteor 项目中工作,我发现了一个奇怪的行为,我将在这里描述:

有一个Tracker.autorun 块,里面有一个Meteor.subscribe 调用。到目前为止,一切都很好。在服务器端,有一个匹配的Meteor.publish,它声明了一个回调。

据我了解,Meteor.publish 回调应该为收到的每个订阅触发一次,但不知何故,这个回调会为单个订阅触发 3~4 次。

在我上次的测试中,Tracker.autorun 块执行了 4 次,订阅只执行了 1 次,回调触发了 4 次。

Meteor.subscribe 只运行一次,即使是跟踪器也会运行多次。它怎么会导致回调多次触发?

这有意义吗? 你知道什么可以解释这种行为吗?

如果您需要任何其他信息,请告诉我。 提前致谢

Meteor.publish('current-user', function currentUser(credentials) {
  return Users.find();
});
Tracker.autorun((c) => {
  if (!currentUserHandler) {
    currentUserHandler = Meteor.subscribe('current-user', this.credentials);
  }
});

【问题讨论】:

  • 这是完整的代码吗? this.credentials 是像 ReactiveVarReactiveDict 这样的反应式数据源吗?
  • 不,实际上这不是完整的代码。 this.credentials 是一个包含会话存储中的一些值的对象。

标签: javascript reactjs meteor


【解决方案1】:

您应该期望自动运行会在正常情况下触发两次,一次没有数据,第二次有一些数据。

也就是让你在数据到达之前显示一个“加载”状态。

您正在订阅users 集合,这是一个special 集合。 Meteor 使用它进行身份验证,也用于记录会话活动。您正在执行Users.find(),这是对整个用户集合的未过滤查询,因此对任何用户的任何修改都会导致它触发。您也无法查看所有用户记录(出于安全原因)。

您可能在用户记录中存储了其他数据,因此您需要订阅它。我建议您考虑将此数据存储在另一个集合中,例如“成员”、“访问者”、“个人资料”或任何适合您的名称。那样的话事情可能会更好。

【讨论】:

  • Users.find 有一个选择器,但我在示例代码中省略了,我的错。我不明白为什么只有一个订阅会导致回调多次触发。
  • 它被调用是有原因的,要么是用户集合被修改,要么凭证对象包含一个反应变量。请记住,Meteor 会查看您在此自动运行方法中使用的任何内容,并使其对您产生反应。
  • 因此,每次Tracker.autorun 重新运行时,如果其中有一个Meteor.subscbribe,那么即使subscribe 调用没有,匹配的Meteor.publish 回调也会重新运行t 重新执行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 2019-03-06
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
相关资源
最近更新 更多