2014-03-06 32 views
0

我有一個測試集合(「initData」),其中已經包含了一些文件和流星客戶端上下面的代碼:流星Deps.autorun沒有觸發 - 與觀察()相比它有什麼用處?

Meteor.subscribe("initData"); 

Meteor.startup(function() { 
    console.log(InitData.findOne("randIdTest").key); 
    Deps.autorun(function() { 
     var allInitData = InitData.find(); 
     allInitData.forEach(function(entry) { 
      console.log("Deps foreach: " + entry._id); 
     }); 
     var randomObject = InitData.findOne("randIdTest"); 
     console.log("Deps call " + randomObject.key); 
    }); 
}); 

var InitDataObserver = InitData.find().observe({ 
    added: initDataChange, 
    changed: initDataChange, 
    removed: initDataChange 
}); 

function initDataChange() { 
    var allInitData = InitData.find(); 
    allInitData.forEach(function(entry) { 
     console.log("Observer foreach: " + entry._id); 
    }); 
    var randomObject = InitData.findOne("randIdTest"); 
    console.log("Observer call " + randomObject.key); 
} 

我最初的目標是要找到儘快從收集使用數據的最佳方式因爲它在客戶端加載,因爲Meteor.startup被觸發時情況並非如此。 (在上面的第4行代碼中,我得到一個錯誤,因爲InitData.findOne(「randIdTest」)在那一刻未定義。)

我試圖用Deps.autorun()和observe()往上看。 observe()按照您的預期工作。然而,Deps.autorun()根本不會被觸發(不管我是否刪除,修改或添加文檔 - 我也試圖將它放在Meteor.startup(fucntion(){}))之外。

我是否理解Deps.autorun()錯誤或者我是否實現了錯誤?在這種情況下,我應該使用Deps.autorun()和when observe()嗎?

回答

1

首先,從文檔:

如果一個自動運行的初始運行拋出異常,計算時自動停止並不會重新運行。

因此,如果您Meteor.startup塊訂閱之前執行到InitData已準備就緒,randomObject是不確定的,因爲出現這樣的情況給出一個錯誤被拋出,你Deps.autorun不會再次運行,無論你做什麼。

iron-router包中有方法可以很容易地處理這種情況,我建議你去探索它們。在上面的例子中,通過檢查是否定義了randomObject來避免第一次運行時拋出的錯誤顯然是非常簡單的,這應該使Deps.autorun按預期工作。無論是這個還是observe塊似乎都會對你描述的用例有用,因爲在客戶端上填充minimongo數據庫時都會觸發這兩種情況,但是鐵路由器解決方案可能更乾淨。

+0

感謝您的所有輸入。這確實是由於未定義的randomObject,但它看起來像Deps.autorun也不會在調用之前發生錯誤時運行。所以我也必須檢查第4行的InitData.findOne(「randIdTest」).key和第11行的randomObject。現在Deps.autorun被觸發。 我現在檢查鐵路由器,然後堅持觀察()(因爲它看起來比Deps.autorun快一點)或使用鐵路由器。 –

相關問題