2017-09-23 15 views
0

私はMeteorJSを完全に新しくしています。デモを見て回っているだけです。本当に基本的なものが欠けている可能性があります。 私はmeteorとangular-ui-routerを使用しています。コントローラにデータをロードする状態から始めると、DDPがまだ初期化されていないため、問題が発生します。これは、ルーティング設定のMeteor: How can I tell when the database is ready?MeteorJSの接続遅延の問題

関連部分で説明したものと同様である:

 resolve: { 
      location: ($stateParams) => { 
       console.log('find', $stateParams); 

       let handle = setInterval(function() { 
        console.log(Meteor.status().connected, Meteor.status().status); 
        console.log(!!Locations.findOne({code: $stateParams.code}) ? 'found' : 'not found'); 
       }, 100); 

       setTimeout(function() { 
        clearInterval(handle); 
       }, 2000); 

       console.log(Meteor.status().connected, Meteor.status().status); 
       return Locations.findOne({code: $stateParams.code}); 
      } 
     } 

と出力が

false "connecting" 
false "connecting" 
not found 
true "connected" 
not found 
true "connected" 
not found 
true "connected" 
found 
true "connected" 
found 

私の質問は次のとおりです。 は私が正しく理解しているここでの問題予想どおりに動作するためには、次の順序で実行する必要があります。

  1. ウェブソケット接続が開始され
  2. ウェブソケット接続が
  3. minimongoを使用する準備ができている
  4. リフレッシュcollection.findOne

と4は3の前に実行されているのですか?もしそうなら、推奨される回避策は何ですか?

クロスポスト:https://github.com/meteor/meteor/issues/9127

答えて

2

あなたは、サブスクリプションは、結果をレンダリングする前準備であるかどうかを確認する必要がありメテオでを購読たび。通常は、スピナーを表示しません。

const mySub = Meteor.subscribe('somePublication'); 
if (mySub.isReady()) { 
    ... you can access the data using minimongo 
} else { 
    ... not so fast Jack 
} 

DDPのWebSocketの接続は、パブ-subがデータを転送する前にアップする必要がありますが、それはほとんどの場合、遅延の非常に重要な原因ではありません。

公開はTracker.autorun()に準備ができるときに、イベントをキャッチすることができます:

const mySub = Meteor.subscribe('somePublication'); 

Tracker.autorun(() => { 
    if (mySub.ready()) ... do something 
}); 

またはサブスクリプションからのコールバック中に:

Meteor.subscribe('somePublication',() => { 
    ... subscription is ready 
}); 
+0

あなたは暗黙のうちに、私が求めているものを確認するように見えます、あなたは明示的にそれをしていただけますか? には、同じことを行う非同期メソッドがあります。 mySub.onReady(コールバック)? – ilj