2017-03-08 3 views
0

パブがラップされ、外部APIがあります。クライアントは外部apiパブをサブサブします。請求方法を有効にするために押すことができる「ACTIVATE」ボタンがあります。ボタンは、コレクションを更新する更新メソッドを呼び出します。パブは外部APIを更新します。シミュレーションが実行され、クライアントコレクションが更新されます。ボタンが 'DEACTIVATE'に変更されます。これが問題の原因となります。外部APIは更新されたドキュメントを返すまでに時間がかかります。ボタンの100〜200ms以内に 'DEACTIVATE'になると 'ACTIVATE'に戻り、その後500ms後に 'DEACTIVATE'に戻り、外部APIに問題がないと仮定する必要があります。パブの更新が遅いシミュレーションのあるメイバーサブ/パブ

私は、クライアントでこれを処理するためのいくつかのハックな解決策を考え出すことができましたが、シミュレーション/クライアントコレクションにパブが遅くて頻繁には更新されないと伝える方法があるのだろうかと疑問に思いますか?したがって、パブ/外部APIに更新を完了するための時間を与えます。

+0

こんにちは、マイケル。私は 'future.js'を使って同様の問題を解決しました。 [こちらをチェックしてください](https://github.com/laverdet/node-fibers)。また、あなたのパブ/サブコードと外部APIコールを投稿してください。たぶんそれは質問に答えるのを助けるかもしれません。 –

+0

この状況に対処できるいくつかの特定のメソッドがMeteor APIにあります。あなたのパブ/サブコードと関連するクライアントコードを投稿すれば、私はいくつかの助けをすることができます。 – jordanwillis

+0

これはコードの投稿を避けることを望んでいましたが、私はMVPを構築して、それを1〜2日後に投稿します。外部APIをラップし、他の多くのライブラリを使用するクラスを構築しました。私はすぐに感謝する何かを得るでしょう。 –

答えて

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のために使用する大規模なライブラリからです。

関連する問題