it_kbg
522
2018-08-07 08:34:35 작성 2018-08-07 08:54:28 수정됨
5
607

await이 동작 안 하는 문제


안녕하세요.


await 관련 문의 드립니다.


제가 진행하고 있는 작업은

검색어와 검색할 페이지 갯수를 받아서 구글search 정보를 가져오는 것인데요.(크롤링)


코드는 아래와 같습니다.


    let promises = []; //promise 들이 저장될 배열
    let totalData = []; //최종 데이터

    //요청 페이지 수 만큼 request 요청 
    let makeRequest = function(url) { 
      return new Promise((resolve, reject) => {
        request(url, function(err, response, body){
          if(body == null) { return reject('fail'); }

          const $ = cheerio.load(body);
          let parsingData = $('.g .r a');
          console.log(parsingData);

          for(let i = 0; i < parsingData.length; i++){
              totalData.push(parsingData[i]);
          }

          return resolve('success');
        });
      });
    }

    //url을 makeRequest로 넘기고 promises에 push
    for(let i = 0; i < pageCount; i++){
      let url = `https://google.com/search?q=${ searchWord }&start=${i}0`
      promises.push(makeRequest(url));
    }


    (async function(){
      try{
        //모든 Promise가 완료되면 실행
        await Promise.all(promises);   
        console.log(totalData); 
        return res.json(true);
      }
      catch(error){
        console.log(error);
        return res.json(false);
      }
    });



근데 문제는..


async await 자체가 실행이 안된건지..

모든 Promise가 resolved 상태로 변해도.. 

console.log(totalData); 가 실행이 안 되는 것입니다..


디버깅을 하면서 보니

모든 Promise는 pending 상태에서 resolved 상태로 변경되는 것을 확인하였습니다.



크롤링도 정상적으로 동작하여 원하는 정보를 가져오는 것도 확인하였습니다.




그런데... ㅠㅠㅠㅠ

async, await이 동작 안하는 이유를 도무지 모르겠습니다...


어제부터 머리 꽁꽁 싸매다가

조언을 구하고자 글을 올립니다 ㅠ_ㅠ

0
0
  • 답변 5

  • it_kbg
    522
    2018-08-07 09:19:59 작성 2018-08-07 09:20:47 수정됨

    무의식 중에 해답이 생각난다고...


    침대에 누워있다가... 아차 싶어서 확인해보니


    익명함수로 만들어 놓고 호출을 하지 않았네요.... -_-


    async 마지막 단락에 () 붙여서 해결했습니다 ㅠ_ㅠ

    0
  • NoDe
    3k
    2018-08-07 09:21:22

    마지막 IIFE 에서 마지막에 실행 구문은 일부로 안넣으신 건가요 ??


    (function () {} ())  or (function () {})()


    그리고 한가지더 궁금한점이 res 를 사용하신거 보면 node 서버사용하시려는거 같은데


    IIFE 로 감싼이유가 있나요 ?? 


    구지 저렇게 실행하지 않아도 Promise.all 은 동작하는데 말이죠 궁금하네요 ~




    0
  • NoDe
    3k
    2018-08-07 09:22:23

    아이고 해결하셨네 ㅋㅋㅋ  

    0
  • it_kbg
    522
    2018-08-07 09:28:00 작성 2018-08-07 09:28:26 수정됨

    NoDe

    제가 then을 싫어해서...

    깔끔하게 보이려고 async await에 넣었습니다ㅎㅎ;;

    then을 싫어하는 이유는 코드를 볼 때 난잡해지는 느낌이 있더라구요


    말씀해주신대로 IIFE는 굳이 쓸 이유는 없죠ㅋㅋ

    0
  • NoDe
    3k
    2018-08-07 09:34:46

    솔직히 callback 지옥이나 then 이나 별다를게 없긴하죠. 보기 좋으라고 then 쓰는거지

    전역변수로 사용하려면 직접 호이스팅도 해줘야하고 const 로 쓰고싶은데 let 으로 해줘야하고 

    너무 막히는게 많아요 ㅋㅋㅋ 

    저도 함수하나를 더 쓰더라도 async await 를 씁니다 JS 개발자의 고충 ...

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