我有一个包裹和外部API的pub。客户端包含外部api pub。有一个' ACTIVATE'他们可以按下按钮来激活计费方法。 Button调用更新集合的更新方法。酒吧更新外部API。 Simulation运行并更新客户端集合。按钮更改为“停用”'正如所料。这就是问题所在。外部api需要一些时间才能返回更新的文档。在按钮的100-200ms内转向“停止”'它会回到“激活”状态。然后500ms后面回到' DEACTIVATE'它应该假设外部api没有问题。
我确定我可以在客户端提出一些hacky解决方案来解决这个问题,但是想知道是否有办法告诉模拟/客户端集合酒吧很慢并且不经常更新?因此,给pub / external api更多时间来完成它的更新。
答案 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的大型库。