2016-08-04 4 views
1

새로 고침 할 때마다 모든 Firebase 컨텐트를 무작위로로드하고 싶지만 모든 Firebase 데이터를 사전에 임의로 가져올 수는 없습니다.자바 스크립트 - Google Firebase에서 임의로 데이터를 가져 오는 방법은 무엇입니까?

전역 배열이 있고 거기에 파일을 밀어 넣고 반복합니다. 그러나 Javascript는 타이밍이 꺼져 있기 때문에 배열이 비어 있다고 생각합니다. 코드를 입력하는 방법, 내가 로그가 먼저 입력 할 것 '여기 randomStore의 길이가'가정 것이다, 대신 내가 얻을 고려

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 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을 사용하지 않아도 그대로 유지하면 차이가 없습니다. 나는 그룹이 더 많아서 그 기능을 가지고있다. 자바 스크립트 약속이란 무엇입니까? 나는 '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()); 
    }); 
} 

코드는 테스트되었지만 시작해야합니다.

관련 문제