야옹아멍멍해바
20
2021-07-28 23:49:27 작성 2021-07-29 00:23:27 수정됨
3
169

javascript 비동기 관련해서 질문 요청합니다..


제가 하고자 하는 것은 

  아이들(data)의 이름들(name-array)을 가지고

  각각의 id값들을 찾아서

  그것들을 다시 id-array로 만들고

  그 id-array를 데이터베이스로 전송하고자 합니다.


그래서 제가 작성한 코드를 보여드리면


function getID(name) {
  const db = firebase.firestore();
  return new Promise((resolve, rejct) => {
    db.collection("아이").where("이름", "==", name)
      .get()
      // '아이' 라는 콜렉션에서 (name) 값의 이름을 가진 item을 가져옵니다.
      .then((querySnapshot) => {
        querySnapshot.forEach((doc) => {
          resolve(doc.id); //해당 이름을 가진 item의 id 값 입니다.
        });
      })
  });
}

function getIDList() {
  // id값을 찾고자 하는 아이들의 이름이 담겨있습니다.
  const nameList = ['노엘', '찬서'];
  return new Promise((resolve, rejct) => {
    var IDList = []; // return 할 ID값 리스트 입니다.
    nameList.forEach((_name) => {
      getID(_name).then((result)=>{
        IDList.push(result);
        // console
        console.log("getIDList() :",IDList);
      })
    })
    resolve(IDList);
  })
}

// main 함수
getIDList().then((result)=>{
  // console
  console.log("main() :",result);
})


이렇게 작성했는데.. 콘솔창을 확인해보니

이렇게 getIDList() 함수 내에서는 array에 id 값을 차곡히 잘 쌓고 있는데

main() 함수에서로 가져온 array 는 값이 비어있더라구요..

그리고 호출도 main() 함수가 먼저 호출되어 있고


많이 미숙한 질문일 수도 있겠지만 답변해주신다면 너무나 너무나 감사드리겠습니다!!

0
  • 답변 3

  • 메이플비
    361
    2021-07-29 01:10:56
    resolve(IDList);

    아마 이부분이 결과를 받기도 전에 리졸브를 해버려서 그런걸꺼에요



  • 야옹아멍멍해바
    20
    2021-07-30 17:14:43 작성 2021-07-30 18:26:16 수정됨

    foreach 문은 값이 다 나올때까지 기다려 주질 않는 군요!

  • 야옹아멍멍해바
    20
    2021-07-30 17:41:35

    이 방법으로 해결했습니다! 감사합니다!!

    function getID(name) {
      const db = firebase.firestore();
      return new Promise((resolve, rejct) => {
        db.collection("아이").where("이름", "==", name)
          .get()
          // '아이' 라는 콜렉션에서 (name) 값의 이름을 가진 item을 가져옵니다.
          .then((querySnapshot) => {
            querySnapshot.forEach((doc) => {
              resolve(doc.id); //해당 이름을 가진 item의 id 값 입니다.
            });
          })
      });
    }
    
    async function getIDList() {
      // id값을 찾고자 하는 아이들의 이름이 담겨있습니다.
      const nameList = ['노엘', '찬서'];
      var IDList = [];
      for(const name of nameList) {
        await getID(name).then((result)=>{
          IDList.push(result);
        })
      }
      return IDList;
    }
    
    // main 함수
    getIDList().then((result)=>{
      // console
      console.log("main() :",result);
    })


  • 로그인을 하시면 답변을 등록할 수 있습니다.