2015-12-22 52 views
1

我不知道爲什麼這個代碼在一段時間工作的一次失敗,其他時間:有時Meteor.users.findOne(用戶名:'john')返回undefined?

var u = Meteor.users.findOne(username:'john'); 
console.log(u); 

當我去到我的網頁,第一次,有時console.log(u)顯示了一定的成效。但如果我按刷新,console.log(u)顯示未定義。我不能一貫地重現一個問題或另一個問題。當我得到未定義或集合時,它似乎很隨機。我的代碼有什麼問題?我如何始終獲得變量u的集合?

+1

我有這個怪異的行爲了。每當我刷新頁面時,有時它會給出'undefined' –

+0

沒有什麼是你的代碼錯誤,你只是不能確定何時執行代碼:在用戶集合同步到客戶端之前或之後。有各種各樣的方法,例如,使用從訂閱返回的ready()方法,或者在使用鐵路路由器時使用waitOn。但在大多數情況下,您可以忽略這一點,因爲反應性會照顧到它的更新頁面,無論它取決於此數據。 –

+0

像基督教說,這沒有什麼不妥,你可以用一個簡單的if(u){// console.log(u)}來修復令人討厭的undefined並完成 – Ethaan

回答

2

像Christian Fritz在評論你的問題時說過的,這可能是你的代碼執行時沒有完全加載的集合。如果您使用的是iron:router,則可以使用subscribewaitOn(如上所述):http://iron-meteor.github.io/iron-router/#the-waiton-option因此只有在收集準備就緒(意味着它們已完全加載)時才加載頁面。 您也可以將其放入幫助程序或使用Tracker Autorun來檢測您的條目何時可用,然後執行任何您想要的操作。

編輯:一種鐵樣品:路由器下面

// myproject.jsx 

var Cars = new Mongo.Collection('cars'); 
if(Meteor.isServer) 
{ 
    Meteor.publish("myCollections", function() { 
     return Meteor.users.find(); 
    }); 
    Meteor.publish("anotherCollection", function(){ 
     return Cars.find(); 
    }); 
} 

//lib/router.js 

Router.route('/my-page', { 
    name: 'myPage', 
    layoutTemplate: 'myPage', 
    waitOn: function() { 
     'use strict'; 
     return [Meteor.subscribe('myCollection'),Meteor.subscribe('anotherCollection')]; 
    }, 
    data: function() { 
     'use strict'; 
     return Collection.findOne(); 
    } 
}); 
+0

謝謝。我已經嘗試了一些waitOn的示例代碼,訂閱和發佈,但獲得了各種意想不到的結果。你能發表一個特定於我的情況的示例代碼嗎?然後,我會明白我在做什麼錯 – John

+0

哦,等等,我想我終於搞定了......我很快會發布示例代碼 – John

+0

我用示例代碼更新了我的答案。 – ko0stik