これは本当に簡単だとわかりました。
クライアント側のシミュレーションだけでは不十分です。そのトリックはサーバー側のシミュレーションも行うことです。この最初の設定を行うには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のために使用する大規模なライブラリからです。
こんにちは、マイケル。私は 'future.js'を使って同様の問題を解決しました。 [こちらをチェックしてください](https://github.com/laverdet/node-fibers)。また、あなたのパブ/サブコードと外部APIコールを投稿してください。たぶんそれは質問に答えるのを助けるかもしれません。 –
この状況に対処できるいくつかの特定のメソッドがMeteor APIにあります。あなたのパブ/サブコードと関連するクライアントコードを投稿すれば、私はいくつかの助けをすることができます。 – jordanwillis
これはコードの投稿を避けることを望んでいましたが、私はMVPを構築して、それを1〜2日後に投稿します。外部APIをラップし、他の多くのライブラリを使用するクラスを構築しました。私はすぐに感謝する何かを得るでしょう。 –