2016-08-04 39 views
1

Ich möchte, dass alle Inhalte von Firebase bei jeder Aktualisierung nach dem Zufallsprinzip geladen werden, aber ich kann nicht alle meine Firebase-Daten in ein Wörterbuch übertragen, in das ich sie randomisieren kann.Javascript - Wie Daten aus Google Firebase nach dem Zufallsprinzip abgerufen werden?

Ich habe ein globales Array und ich versuche, meine Dateien dorthin zu schieben und dann durchlaufen sie. Aber Javascript hält das Array für leer, weil das Timing ausgeschaltet ist.

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); 
    }); 
} 

Bedenkt man, wie der Code eingegeben wird, würde ich davon ausgehen, dass das Protokoll zuerst eingegeben würden ‚randomStore Länge HIER ist‘, sondern das ich bekommen:

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

Wenn ich in meine Daten einsehen ein anderes Array, dann könnte ich es manipulieren, um nach dem Zufallsprinzip zu sortieren und so was zu tun, aber ich kann es nicht richtig da hinein bekommen.

Antwort

0

Sie erwähnten das Timing ist ausgeschaltet? Was wolltest du damit sagen ?

Haben Sie von Javascript Promise gehört?

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

Dieser Beitrag erklärt verspricht sehr gut. Lesen Sie dies sehr sorgfältig, denn wenn Sie mit Firebase arbeiten, werden Sie Versprechungen auf täglich verwenden!

+0

Sie müssen 'addFeaturedImages() nicht aufrufen'. Lassen Sie einfach das auf wie es ist, ohne die addFeaturedImages – IvRRimUm

+0

IvRRimUm, macht keinen Unterschied. Ich habe diese Funktion, weil ich mehr Gruppen habe, und es ist in Ordnung. Was sind Javascript Promise? Ich würde annehmen, dass die console.log innerhalb der "Ref.on" -Funktion zuerst gedruckt würde, aber es ist AFTER gedruckt. Daher würde ich annehmen, dass es asynchron läuft, weil es Firebase ist, also wird die console.log innerhalb von homeSetup vor den geloopten ausgeführt. – Homerdough

+0

Ja, Promises sind genau dafür gemacht. Ich werde den Beitrag mit einem Zitat aus der Dokumentation aktualisieren. – IvRRimUm

0

Anstelle von featuredRef.on("child_added") verwenden Sie featuredRef.once('value'). Dies sollte Ihnen das gesamte Array auf einmal bringen. Fügen Sie einen then Listener hinzu, wo Sie mit der Arbeit von homeSetup fortfahren.

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()); 
    }); 
} 

Code nicht getestet, aber ich sollte Sie beginnen.