2016-08-04 13 views
1

Firebaseのすべてのコンテンツをリフレッシュするたびにランダムにロードしたいのですが、私はすべてのFirebaseデータをランダム化できる辞書に入れることができません。Javascript - ランダムにGoogle Firebaseからデータを取得するにはどうすればよいですか?

私はグローバル配列を持っていますが、そこにファイルをプッシュしてから繰り返します。しかし、Javascriptは、タイミングがずれているため配列が空であると考えます。

var randomStore = new Array; 

function homeSetup() { 
    if(ref.toString() == featuredRef.toString()){ 
     addFeaturedImages(); 
    } 
    console.log('randomStore length is ' + randomStore.length); 
} 

function addFeaturedImages(){ 
    featuredRef.on("child_added", function(snapshot) { 
     var doc = { 
      // 'name': snapshot.key, //name is the id 
      'artist': snapshot.val().artist, 
      'author': snapshot.val().author, 
      'projectTitle': snapshot.val().projectTitle, 
      'text': snapshot.val().text 
     }; 
     randomStore.push(doc); 
     console.log('randomStore length HERE is ' + randomStore.length); 
    }); 
} 

コードが入力されたかを考えると、私は、ログが最初に入力されたことになる「HERE randomStore長は」、代わりに私はこれを取得することを前提としています:

randomStore length is 0 
randomStore length HERE is 1 
randomStore length HERE is 2 
randomStore length HERE is 3 

私はに私のデータを得た場合別の配列であれば、それをランダムに並べ替えるように操作することができますが、そのようにすることはできますが、正しくそこに入れることはできません。

答えて

0

タイミングがオフになっているとお伝えしましたか?あなたはそれによって何を意味しました ?

Javascript Promiseについて聞いたことがありますか?

http://www.html5rocks.com/en/tutorials/es6/promises/

この投稿は、非常に良い約束を説明します。 firebaseを使って作業している場合は、に約束しており、毎日になるので、これをよく読んでください!

+0

あなたは 'addFeaturedImages();'を呼び出す必要はありません。addFeaturedImages – IvRRimUm

+0

IvRRimUmを使わずにそのまま放置すると、違いはありません。グループが増えているので、その機能があります。 javascriptとは何ですか?私は、 'ref.on'関数内のconsole.logが最初に印刷されると仮定しますが、後で印刷されます。ですから、私はそれがFirebaseだから、非同期的に動いていると仮定します。したがって、homeSetup内のconsole.logはループされたものの前に実行されます。 – Homerdough

+0

うん、それはまさに約束だ。私は書類から見積もりでポストを更新します。 – IvRRimUm

0

featuredRef.on("child_added")の代わりにfeaturedRef.once('value')を使用してください。これはすぐに配列全体を取得する必要があります。 homeSetupの作業を続行する場合は、thenリスナーを添付してください。

function homeSetup() { 
    var cb = function(randomStore) { 
     console.log('randomStore length is ' + randomStore.length); 
     //.... 
    }; 


    if(ref.toString() == featuredRef.toString()){ 
     addFeaturedImages(cb); 
    } /* else if(...) { 
     addFooImages(cb) 
    }*/ 
} 


function addFeaturedImages(cb){ 
    featuredRef.once("value", function(snapshot) { 
     //TODO: transform elements of the array? 
     cb(snapshot.val()); 
    }); 
} 

コードはテストされていませんが、開始する必要があります。

関連する問題