Promise fulfilled, but PromiseResult is undefined??๐Ÿ˜จ

ํžˆ์ง„๋กœ๊ทธยท2022๋…„ 9์›” 27์ผ
1

mini-project

๋ชฉ๋ก ๋ณด๊ธฐ
24/28
post-thumbnail

๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…, todo Form ์ž‘์„ฑ axios๋กœ์ง๋“ค์€ ๋ชจ๋‘ ๋ถ„๋ฆฌ๋ฅผ ํ–ˆ์ง€๋งŒ
todo title ๋ฐ›์•„์˜ค๊ธฐ, todo detail ๋ฐ›์•„์˜ค๊ธฐ ๋กœ์ง๋“ค์€ UI ์ปดํฌ๋„ŒํŠธ ๋‚ด์— ๊ฐ™์ด ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” todo title, todo detail axios๋กœ์ง๋“ค๋„ ๋ถ„๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ ค๊ณ  ํ–ˆ๊ณ  ์ฝ”๋“œ๋„ ์ž‘์„ฑํ–ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ๋ถ„๋ฆฌํ•œ ๋กœ์ง์—์„œ return๊ฐ’์„ ๋ฐ›์•„์™€์„œ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ์—์„œ ์ฝ˜์†”์— ์ฐ์–ด๋ณด๋ฉด Promise {<pending>}๊ฐ’์ด ์ฐํžˆ๊ณ  PromiseResult๊ฐ’์€ undefined๊ฐ€ ์ฐํžˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋•Œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ โฌ‡

// axios get ์š”์ฒญ (todo title)

  const getTodo = async () => {
    try {
     await axios
        .get('http://localhost:8080/todos', {
          headers: {
            Authorization: token,
          },
        })
        .then((result) => 
              console.log(result.data.data)
              return result
             );
    } catch (error) {
      console.log(error);
    }
  };

// TodoTitle ์ปดํฌ๋„ŒํŠธ์—์„œ get ์š”์ฒญ ๊ฒฐ๊ณผ ๋ฐ›์•„์˜ค๊ธฐ

useEffect(() => {
    token && console.log(getTodo());
  }, [create, id]);

์™œ ์ด๋Ÿฐ์ง€ ๋ชจ๋ฅด๊ฒ ๊ณ  ๊ทธ๋ž˜์„œ ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฐ๐ŸŠ๋„ ์•ˆ ์™€์„œ ๊ตฌํ˜„ ๋‹น์‹œ์—๋Š” ์ผ๋‹จ ๋„˜์–ด๊ฐ”๋‹ค.
+ 10์›” 2์ผ
ใ…Žใ…Žใ…Ž ๋‹น์—ฐํžˆ undefined๊ฐ€ ์ฐํžˆ๊ฒ ์ง€. return๊ฐ’์ด ํ•˜๋‚˜๋„ ์—†๋Š”๋ฐ๐Ÿ˜ฉ
๊ทธ๋ฆฌ๊ณ  async awiat์„ ์ด์šฉํ•œ axios์š”์ฒญ์„ ๋ฐ›์•„์™”์œผ๋‹ˆ๊นŒ Promise๊ฐ€ ๋„˜์–ด์˜จ ๊ฑฐ์˜€๊ณ . ๋งŒ๋“œ๋Š” ๋‹น์‹œ์— ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜์ง€์— ์ง‘์ค‘ํ•ด์„œ ๊ทธ๋Ÿฐ๊ฐ€ ๋นจ๋ฆฌ ์บ์น˜๋ฅผ ๋ชปํ–ˆ๋„ค. ์ ˆ๋Œ€ ๋ชป ์žŠ์„ ๋“ฏ.

์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด์„œ then์œผ๋กœ ๊ฒฐ๊ด๊ฐ’์„ ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์—, ๋กœ์ง์„ ์ž‘์„ฑํ•œ ์ปดํฌ๋„ŒํŠธ์ชฝ์—์„œ๋Š” ๊ฒฐ๊ด๊ฐ’์ด ์ฝ˜์†”์— ์ž˜ ์ฐํžˆ๋Š”๋ฐ, ์ด๊ฒŒ TodoTitle์ปดํฌ๋„ŒํŠธ์—์„œ ์ฝ˜์†”์„ ์ฐ์œผ๋ฉด Promise {<pending>}๊ฐ’์ด ์ฐํžŒ๋‹ค.

์™œ ๊ทธ๋Ÿฐ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์–ด์„œ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์ชฝ์—์„œ๋Š” ์š”์ฒญ๋งŒ ๋ณด๋‚ด๊ณ  ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฒฐ๊ด๊ฐ’์„ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์ผ๋‹จ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”๋ดค๋‹ค.

// ์ˆ˜์ •ํ•œ axios get ์š”์ฒญ (todo title)

  const getTodo = async () => {
    try {
      const result = await axios
        .get('http://localhost:8080/todos', {
          headers: {
            Authorization: token,
          },
        })
      return result
    } catch (error) {
      console.log(error);
    }
  };

// ์ˆ˜์ •ํ•œ TodoTitle ์ปดํฌ๋„ŒํŠธ์—์„œ get ์š”์ฒญ ๊ฒฐ๊ณผ ๋ฐ›์•„์˜ค๊ธฐ

  useEffect(() => {
    const newData = getTodo().then((result) => {
      return result;
    });
    console.log(newData);
    token && setDatas(newData);
  }, [create, id]);

์ด๋ ‡๊ฒŒ ํ–ˆ๋”๋‹ˆ Promise {<pending>}๊ฐ’์ด ์ฐํžˆ๊ธด ํ•˜์ง€๋งŒ PromiseResult๊ฐ’์—๋Š” ๊ฒฐ๊ณผ ๊ฐ’์ด ๋“ค์–ด์™”๋‹ค!
+ 10์›” 2์ผ
๊ทธ๋ ‡์ง€.. ์—ฌ๊ธฐ์„œ๋Š” result ๋ณ€์ˆ˜์— axios์š”์ฒญ ๊ฐ’์„ ๋„ฃ๊ณ  return์„ ํ•ด์ฃผ๊ณ  ์žˆ์œผ๋‹ˆ๊นŒ Promise๊ฐ€ ๋„˜์–ด์˜ค๋ฉด์„œ ์š”์ฒญ๋ฐ›์€ ๊ฐ’์„ ๋„˜๊ฒจ๋ฐ›์€ ๊ฑฐ์ง€

์ด ๊ฒฐ๊ณผ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ. ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ๋˜ ์–ด๋ ต๋‹ค.
์ฒ˜์Œ์—๋Š” ๊ทธ๋ƒฅ ์œ„์— ์ฒจ๋ถ€ํ•œ ์ฝ”๋“œ๋Œ€๋กœ ์ˆ˜์ •ํ•˜๋ฉด ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ์•„๋‹ˆ์—ˆ๋‹ค.

โœจํ•ด๊ฒฐํ–ˆ๋‹คโœจ

์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ, ๊ฐœ์ธ ๋ธ”๋กœ๊ทธ ๊ธ€๋“ค์„ ๋‹ค ๋’ค์ง€๋ฉฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ๋ฉด์„œ async await์€ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , then์„ ํ•ด์„œ ๊ฒฐ๊ด๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ธ€์„ ๋งŽ์ด ๋ดค๋‹ค.
๋ชจ๋ฅด๋Š” ๋‚ด์šฉ์€ ์•„๋‹Œ๋ฐ ๊ทธ๋ž˜์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋ƒ๊ณ  ๊ฐ€ ๋ฌธ์ œ์˜€๋‹ค.

๊ณ„์† ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ TodoTitle์ปดํฌ๋„ŒํŠธ์—์„œ getTodoํ•จ์ˆ˜์˜ ๊ฒฐ๊ด๊ฐ’์„ ์ฝ˜์†”๋กœ ์ฐ์–ด๋ณด์•˜๋‹ค.

 useEffect(() => {
    const newData = getTodo().then((result) => {
      console.log(result); // โœ… ์ด ์ฝ”๋“œ ์ถ”๊ฐ€
      return result;
    });
    console.log(newData);
    token && setDatas(newData);
  }, [create, id]);

์ฝ”๋“œ๋ฅผ ์ €๊ธฐ์— ์ถ”๊ฐ€ํ–ˆ๋”๋‹ˆ ์ฝ˜์†”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ์ฐํ˜”๋‹ค!

.thenํ•จ์ˆ˜ ์•ˆ์—์„œ ๋ฐ”๋กœ ์ฝ˜์†”์„ ์ฐ์œผ๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋ฐ›์•„์™€ ์ง€๋Š”๋ฐ ์™œ return ๊ฐ’์œผ๋กœ newData๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ ํ›„ newData๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Promise<pending>๊ฐ’์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์ผ๊นŒ. ์—ญ์‹œ๋‚˜ async await์€ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ผ๊นŒ? (๊ณต๋ถ€๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„ ์ฐพ์•˜๋‹ค๐Ÿ’ก)
๊ทธ๋ž˜์„œ getTodoํ•จ์ˆ˜์˜ .then()์•ˆ์—์„œ ๋ฐ”๋กœ setDatas๋กœ datas state๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์คฌ๊ณ , ๋ฐ‘์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค.

// TodoTitle ์ปดํฌ๋„ŒํŠธ 

 useEffect(() => {
    token &&
      getTodo().then((result) => {
        setDatas(result.data.data);
      });
  }, [create, id]);

๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ todo detail์„ ๋ฐ›์•„์˜ค๋Š” axios ์š”์ฒญ ๋กœ์ง๋„ ๋ถ„๋ฆฌํ–ˆ๋‹ค. :)
์ข€ ๋” ๊น”๋”ํ•˜๊ณ  ์šฐ์•„ํ•œ(๐Ÿฆข??) ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ, ๋˜ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ฆฌํŒฉํ† ๋ง ํ•˜๋ฉด์„œ ๊ณ ๋ฏผํ•ด๋ด์•ผ๊ฒ ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€