0

어젯밤에 간단한 JavaScript 배열로 정말 이상한 문제가 발생했습니다. 나는 Firebase 기반의 React Native 앱을 개발 중이고 SDK를 사용하여 실시간 데이터베이스로부터 데이터를 얻고 있습니다. 위의 코드에서 이후의 데이터를 각각의 사용자의 timeline로부터 데이터를 얻을 timelineposts 각 반복 후 얻을 것으로 예상되는JavaScript 배열이 반복 가능하지 않음

var app = this 

    this.props.fb.auth().onAuthStateChanged(function(user) { 
     if (user) { 
      app.props.fb.database().ref('/users/' + user.uid + "/timeline").once('value').then(function(snapshot) { 
       var posts = snapshot.val() 
       return posts 
      }).then((posts) => {     
       var statuses = []; 
       for (i in posts) { 

        app.props.fb.database().ref('/posts/' + posts[i]).once('value').then(function(snapshot) { 
         statuses.push(snapshot.val()) 
        }); 
       } 

       console.log(statuses) 
      }) 
     } 

    }); 

: 여기

는 코드 posts. 그런 다음 데이터를 statuses 배열로 푸시합니다.이 배열은 마지막에 콘솔에 기록됩니다.

콘솔에 표시되는 내용입니다. enter image description here

배열이 확장 될 때까지 콘솔에 배열의 항목이 표시되지 않습니다. 또한 배열의 length을 가져 오려고하면 0이 반환되고 배열의 항목을 반복 할 수 없습니다.

내가 뭘 잘못하고 있니?

+0

99/100 JS 오류는 비동기 문제 것 같다 -이 같은 보인다. u 비동기 호출로 채워지는 배열을 콘솔에 로그인 할 수 없습니다. –

+0

['for..in']을 사용하여 배열을 반복해서는 안됩니다 (https://stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-a-bad). -idea) 구조. ['Array.prototype.forEach()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)를 사용하십시오. – Phylogenesis

답변

2

게시물이 iterable 인 경우 q.all의 일부 버전을 사용하고 모든 약속이 해결되면 모든 조각을 상태 배열에 푸시 한 결과를 안정적으로 기록 할 수 있습니다.

일부 의사 코드 :

if (user) { 
     app.props.fb.database().ref(`/users/${user.uid}/timeline`) 
     .once('value') 
     .then(snapshot => snapshot.val()) 
     .then(posts => {     
      const statuses = []; 

      const promises = Object.keys(posts).map(key => { 
       return app.props.fb.database().ref(`/posts/${posts[key]}`).once('value') 
        .then(snapshot => statuses.push(snapshot.val())); 
      } 

      return Promises.all(promises) 
     }) 
     .then(() => console.log(statuses)); 
    } 
+0

어떻게 작동할까요? 나는 이것에 좀 새로운 그래서 만약 당신이 나에게 예제를 보여줄 수 있다면 도움이 될 것입니다 – hackerman

+0

나중에 가서 ... 우리가 Promises.all와 함께 일하는 것 같습니다 - "https://developer.mozilla.org/en-US/ docs/Web/JavaScript/Reference/Global_Objects/Promise/all –

+0

정말 고마워요! – hackerman

관련 문제