带有模拟的Meteor Sub / Pub,其中pub很难更新

时间:2017-03-08 12:43:30

标签: javascript meteor

我有一个包裹和外部API的pub。客户端包含外部api pub。有一个' ACTIVATE'他们可以按下按钮来激活计费方法。 Button调用更新集合的更新方法。酒吧更新外部API。 Simulation运行并更新客户端集合。按钮更改为“停用”'正如所料。这就是问题所在。外部api需要一些时间才能返回更新的文档。在按钮的100-200ms内转向“停止”'它会回到“激活”状态。然后500ms后面回到' DEACTIVATE'它应该假设外部api没有问题。

我确定我可以在客户端提出一些hacky解决方案来解决这个问题,但是想知道是否有办法告诉模拟/客户端集合酒吧很慢并且不经常更新?因此,给pub / external api更多时间来完成它的更新。

1 个答案:

答案 0 :(得分:0)

事实证明这很简单。

单靠客户端模拟是不够的。诀窍是进行服务器端模拟。为了完成第一次设置,Meteor的钩子。发布这个对象就像这样。

_initServer() {
  if (Meteor.isServer) {
    console.log(`Server initializing external collection "${this.name}"`)
    let self = this

    Meteor.publish(this.name, function (selector, options) {
      check(selector, Match.Optional(Match.OneOf(undefined, null, Object)))
      check(options, Match.Optional(Match.OneOf(undefined, null, Object)))

      self.publication = this
      self._externalApi.fetchAll()
        .then((docs)=>docs.forEach((doc)=>this.added(self.name, doc._id, doc)))
        .then(()=>this.ready())
        // todo handle error
        .catch((error)=>console.error(`${self.name}._initServer: self._externalApi.fetchAll`, error))
    })
  }
}

然后在您的更新功能中,您可以在客户端和服务器上进行模拟,如下所示:

  this.update = new ValidatedMethod({
    name: `${self.name}.update`,
    validate: (validators && validators.update) ? validators.update : self.updateSchema.validator({clean: true}),
    run(doc) {
      console.log(`${self.name}.update `, doc)
      if (Meteor.isServer && self._externalApi.update) {
        // server side simulation
        self.changed(doc)

        self._externalApi.update(doc._id, doc)
          .then(self.changed)
          .catch((error)=>handleError(`${self.name}.update`, 'externalApi.update', error))
      } else {
        // client side simulation
        self.collection.update(doc._id, {$set: doc})
      }
    },
  })

道歉如果过度简化,这些例子来自我们用于外部api的大型库。