2013-04-23 46 views
7

爲什麼Meteor集合遊標foreach循環無法在下面的代碼中工作。如果我將這個循環包裝在Template.messages.rendered或Deps.autorun函數中,它就可以工作。我不明白爲什麼。Meteors集合光標forEach不起作用

Messages = new Meteor.Collection("messages"); 

processed_data = []; 

if(Meteor.isClient) { 

    data = Messages.find({}, { sort: { time: 1 }}); 
    data.forEach(function(row) { 
     console.log(row.name) 
     processed_data.push(row.name); 
    }); 
} 

回答

11

代碼運行時郵件收集未準備就緒。

嘗試這樣:

Messages = new Meteor.Collection("messages"); 

if(Meteor.isClient) { 
    processed_data = []; 

    Deps.autorun(function (c) { 
     console.log('run'); 
     var cursor = Messages.find({}, { sort: { time: 1 }}); 
     if (!cursor.count()) return; 

     cursor.forEach(function (row) { 
      console.log(row.name); 
      processed_data.push(row.name); 
     }); 

     c.stop(); 
    }); 
} 

其他解決方案:

與預訂剛玩!您可以將onReady回調傳遞給訂閱 http://docs.meteor.com/#meteor_subscribe

+0

因此,這意味着當我們的瀏覽器加載應用程序時,集合還沒有準備好。我不明白「準備就緒」的含義。 – stariqmi 2013-04-23 04:38:39

+3

該集合正在加載異步。這意味着它正在踢消息加載過程,然後像往常一樣繼續執行代碼。然後,您正試圖訪問該集合,但尚未加載到異步過程中。這意味着它還沒有準備好。 – jhbruhn 2013-04-23 18:33:43

+0

在下面的代碼中,我嘗試了發佈/訂閱技術。工程,但全球處理陣列,我有,當我在瀏覽器控制檯訪問它,它是空的。如果我console.log裏面的訂閱回調,它是填充,但不是當我在控制檯中輸入它。 – stariqmi 2013-04-23 23:33:35