랭킹 화면

순9·2024년 2월 5일

react고양이게임

목록 보기
9/14

메인 화면에서 게임 오버가 되면

팝업창이 뜸
랭킹 버튼을 누르면 랭킹화면으로 이동

점수 관련 타입 설정

interface ScoreType {
    uid?: string;
    scoreCount: number;
    nicName: string;
  }
  const initial: ScoreType[] = [
    {
      uid: "",
      scoreCount: 0,
      nicName:"",
    },
  ];
  
  const [rank, setRank] =  useState<ScoreType[]>(initial);
  
  
  
  const scoreDataList = async () => {
    try {
      const loginUserList = await getDocs(userCollection);

      // Promise.all을 사용하여 모든 프로미스가 해결될 때까지 기다림
      const updatedRank = await Promise.all(loginUserList.docs.map(async (item) => {
        const data = item.data();
        const loginUserDoc = doc(userCollection, data.uid);
        const loginUserScore = collection(loginUserDoc, "score");
        const loginUserScoreDoc = await getDocs(loginUserScore);

        // 프로미스 해결 후 반환하는 데이터
        return loginUserScoreDoc.docs.map((it) => it.data() as ScoreType);
      }));

      // updatedRank는 이제 Promise 배열이 아닌 ScoreType 배열
      setRank(updatedRank.flat());
    } catch (error) {
      console.error("Error fetching and updating data:", error);
    }
  };

Promise.all
모든 프로미스가 완료될 때까지 기다린 후에 하나의 프로미스로 결과를 반환하는 메서드
사용 이유 : 파이어베이스에서 데이터를 불러 와야하는데 지금 사용하는게 비동기 함수를 사용 하기 때문에 제대로 불러 오지를 못해서 모든 프로미스가 다 끝난 후 반환 되는 데이터를 얻기 위해서 알게 Promise.all를 알게 되어서 사용함

flat()
배열 내에 중첩된 배열이나 서브 배열들을 제거하여 하나의 단일 배열로
flat

profile
1. 사용법 익히기 2. 원리가 뭔지 찾아보기 3. 원리를 공부하기

0개의 댓글