2017-09-23 306 views
0

我是MeteorJS的全新新手,只是看着演示和瞎猜。這可能是我錯過了一些非常基本的東西。 我正在使用角流 - 路由器的流星。如果我以加載數據到控制器的狀態開始,由於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連接必須是之前發佈 - 訂閱可以傳輸數據,但是這不是延遲在大多數情況下非常顯著源。

可以趕上事件時,發佈在Tracker.autorun()就緒:

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

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

或從訂閱的回調:

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

你似乎含蓄地確認我所要求的東西,但你能否明確地做? 是否有一種異步方法可以完成相同的操作mySub.onReady(回調)? – ilj