2016-08-04 68 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); 
    }); 
} 

考慮代碼是如何打字,我將認爲「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 Promise的?我會假設'ref.on'函數中的console.log將首先被打印,但它會在後面打印。所以我會假設因爲它是Firebase,它是異步運行的,所以homeSetup中的console.log在循環之前執行。 – Homerdough

+0

是的,承諾是完全正確的。我將通過文檔引用更新帖子。 – IvRRimUm

0

而不是使用featuredRef.on("child_added")使用featuredRef.once('value')。這應該可以讓你一次完成整個陣列。附上一個then聽衆,您繼續homeSetup的工作。

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

代碼未經測試,但我應該讓你開始。

相關問題