2013-04-23 5 views
7

なぜMeteorコレクションのカーソルforeachループが以下のコードで機能しないのですか?ループをTemplate.messages.renderedまたはDeps.autorun関数の中にラップすると、それは機能します。なぜか分からない。Meteors collection cursor 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

+3

コレクションは非同期をロードしています。つまり、メッセージ読み込みプロセスを開始してから通常はコードを処理します。次に、非同期プロシージャにまだロードされていないコレクションにアクセスしようとしています。それは準備ができていないことを意味します。下のコードで – jhbruhn

+0

、私はpublish/subscribe技術を試しました。動作しますが、グローバルに処理された配列は、ブラウザのコンソールでアクセスすると空です。サブスクライブコールバック内のconsole.logの場合、コンソールに入力するときに入力されますが、入力されません。 – stariqmi

関連する問題