EtoC

promise {pending} 본문

BackEnd/NodeJs

promise {pending}

게리드 2023. 8. 4. 22:49

 


오늘도 새로운 에러를 만났다.
promise pending은 비동기함수가 처리 되지않고있는 상태라는것만 알고있는데 뭐가 문제인걸까?

Promise는 3가지의 상태로 나뉜다.

-pending(대기): 이행되지도 거부되지도 않은 상태
-fulfilled(이행): 성공
-rejected(거부): 실패

 

왜..왜 작동하지 않는거냐..

const puppeteer = require("puppeteer");
const cheerio = require("cheerio");

let screenShotList = {
  tag: "",
  title: "",
  influencer: "",
};

const crawl = async (keyword) => {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  const ndhs_searchWord = "";

  await page.goto(
    "https://search.naver.com/search.naver?where=influencer&sm=tab_jum&query="
  );

  await page.click("#nx_search_form > fieldset > div.greenbox");

  await page.evaluate((searchWord) => {
    document.querySelector("#nx_query").value = searchWord;
  }, ndhs_searchWord);

  await page.click("#nx_search_form > fieldset > button");

  if (
    page.url() ===
    `https://search.naver.com/search.naver?where=influencer&sm=tab_jum&query=${encodeURI(
      keyword
    )}`
  ) {
    const data = await page.data();
    const $ = cheerio.load(data);
    const list = $(
      "#wrap #container #content #main_pack #_inf_content_root div div div.challeng_wrap ul"
    ).children("li");
    console.log(list);

    list.each((i, elem) => {
      ulList[i] = {
        tag: $(this).find("div.more_box a span.name ").text(),
        title: $(this)
          .find("div.keyword_box_wrap div.detail_box div.dsc_area a.name_link")
          .text(),
        influencer: $(this)
          .find(
            "div.keyword_box_wrap div.user_box div.user_box_inner div.user_info_bx div.user_area a"
          )
          .text(),
      };
      console.log(ulList[i]);
    });
  } else {
    console.log("failed");
  }
  await browser.close();
};

console.log(crawl("샌드위치"));

crawl();

module.exports = { crawl };

 

이유는 crawl()함수가 Promise를 반환하지 않기때문이였다.

const crawl = async (keyword) => {
  return new Promise(async (resolve, reject) => {
    try {
      const browser = await puppeteer.launch({ headless: true });
      const page = await browser.newPage();
      const ndhs_searchWord = "";

      await page.goto(
        "https://search.naver.com/search.naver?where=influencer&sm=tab_jum&query="
      );

      await page.click("#nx_search_form > fieldset > div.greenbox");

      await page.evaluate((searchWord) => {
        document.querySelector("#nx_query").value = searchWord;
      }, ndhs_searchWord);

      await page.click("#nx_search_form > fieldset > button");

      if (
        page.url() ===
        `https://search.naver.com/search.naver?where=influencer&sm=tab_jum&query=${encodeURI(
          keyword
        )}`
      ) {
        const data = await page.content();
        const $ = cheerio.load(data);
        const list = $(
          "#wrap #container #content #main_pack #_inf_content_root div div div.challeng_wrap ul"
        ).children("li");
        const ulList = [];

        list.each((i, elem) => {
          ulList[i] = {
            tag: $(elem).find("div.more_box a span.name").text(),
            title: $(elem)
              .find(
                "div.keyword_box_wrap div.detail_box div.dsc_area a.name_link"
              )
              .text(),
            influencer: $(elem)
              .find(
                "div.keyword_box_wrap div.user_box div.user_box_inner div.user_info_bx div.user_area a"
              )
              .text(),
          };
          console.log(ulList[i]);
        });
        resolve(ulList);
      } else {
        reject("failed");
      }
      await browser.close();
    } catch (error) {
      reject(error);
    }
  });
};

crawl("샌드위치")
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

 

바보 멍청이 ㅠㅠㅠㅠㅠ