-
[React] ๋น๋๊ธฐ(callback, promise, async/await)Front-end/react 2023. 1. 23. 19:00
๐ ๋น๋๊ธฐ ์์
์๋ฒ์ API๋ฅผ ์ด์ฉํ ๋๋ ๋คํธ์ํฌ ์ก์์ ๊ณผ์ ์์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์
์์ ์ด ์ฆ์ ์ฒ๋ฆฌ๋๋ ๊ฒ์ด ์๋๋ผ, ์๋ต์ ๋ฐ์ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ ๋ฌ๋ฐ์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค.
๋น๋๊ธฐ์ ์ผ๋ก ์์ ์ ์ฒ๋ฆฌํ๋ฉด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ์ถ์ง ์๊ธฐ ๋๋ฌธ์ ๋์์ ์ฌ๋ฌ๊ฐ์ง ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ค.์์) setTimeout ํจ์
setTimeout() ์คํ ์์ ์ 3์ด ๋์ ๋ฉ์ถ๋ ๊ฒ์ด ์๋๋ผ, ์ผ๋จ ์ฝ๋๊ฐ ์๋ถํฐ ์๋๊น์ง ๋ค ํธ์ถ๋๊ณ 3์ด ๋ค์ printMe() ํจ์๊ฐ ํธ์ถ๋๋ค.
function printMe() { console.log("Hello World!"); } setTimeout(printMe, 3000); console.log("๋๊ธฐ ์ค..."); /* ๋๊ธฐ ์ค... Hello React! */
๋น๋๊ธฐ ์์ ์ ํ ๋ ๊ฐ์ฅ ํํ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์
โจโจ ์ฝ๋ฐฑ ํจ์
ํจ์ ์์ฒด๋ฅผ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌํ์ฌ ์ฌ์ฉํ๋ ํจ์
์์) ํ๋ผ๋ฏธํฐ ๊ฐ์ด ์ฃผ์ด์ง๋ฉด 1์ด ๋ค์ 10์ ๋ํด์ ๋ฐํํ๋ ํจ์
// ์ฝ๋ฐฑ ํจ์ // ex) ํ๋ผ๋ฏธํฐ ๊ฐ์ด ์ฃผ์ด์ง๋ฉด 1์ด ๋ค์ 10์ ๋ํด์ ๋ฐํํ๋ ํจ์ function increase(number, callback) { setTimeout(() => { const result = number + 10; if (callback) { callback(result); } }, 1000); } increase(0, (result) => { console.log(result); });
์ฌ๋ฌ ๋ฒ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด? ์ฝ๋ฐฑ ํจ์ ์ค์ฒฉํด์ ๊ตฌํํ๊ธฐ
// ์ฝ๋ฐฑ ์ง์ฅ console.log("์์ ์์ "); increase(0, (result) => { console.log(result); increase(result, (result) => { console.log(result); increase(result, (result) => { console.log(result); console.log("์์ ์์ "); }); }); }); /* ์์ ์์ 10 20 30 */
๐จ ์ฝ๋ฐฑ ์ง์ฅ
์ฝ๋ฐฑ ์์ ๋ ์ฝ๋ฐฑ์ ๋ฃ์ผ๋ฉด ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ ธ์ ์ง์ํ๋ ๊ฒ์ด ์ข๋คโจโจ Promise
์ฝ๋ฐฑ ์ง์ฅ์ ๋ฒ์ด๋๋ ๋ฐฉ๋ฒ!
Promise์์ resolve๋ ๊ฐ์ .then์ ํตํด ๋ฐ์ ์ฌ ์ ์๋ค
Promise๋ฅผ ๋ฆฌํดํ๋ฉด ๋ .then์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ
// Promise function increase2(number) { const promise = new Promise((resolve, reject) => { // resolve - ์ฑ๊ณต, reject - ์คํจ setTimeout(() => { const result = number + 10; if (result > 50) { const e = new Error("์ซ์๊ฐ ์ปค์"); return reject(e); } resolve(result); }, 1000); }); return promise; } increase2(0) .then((number) => { console.log(number); return increase(number); // Promise๋ฅผ ๋ฆฌํดํ๋ฉด ๋ .then์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ }) .then((number) => { console.log(number); return increase(number); }) .then((number) => { console.log(number); return increase(number); }) .catch((e) => { console.log(e); });
โจโจ async/await
Promise๋ฅผ ๋์ฑ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ํค์๋
ํจ์์ ์๋ถ๋ถ์ async ํค์๋๋ฅผ ์ถ๊ฐํ๊ณ , ํด๋น ํจ์ ๋ด๋ถ์์ Promise์ ์๋ถ๋ถ์ await ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.์ด๋ ๊ฒ ํ๋ฉด Promise๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ณ , ๊ฒฐ๊ณผ ๊ฐ์ ํน์ ๋ณ์์ ๋ด์ ์ ์๋ค.
// async / await // Promise๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ณ , ๊ฒฐ๊ณผ ๊ฐ์ ํน์ ๋ณ์์ ๋ด์ ์ ์๋ค async function runTasks() { try { let result = await increase(0); console.log(result); result = await increase(result); console.log(result); result = await increase(result); console.log(result); } catch (e) { console.log(e); } }
'Front-end > react' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] component / props / state (0) 2023.01.17 [React] JSX ๋ฌธ๋ฒ ์ฌ์ฉ ์ ์ง์ผ์ผ ํ ๊ท์น (0) 2023.01.17 [React] State (0) 2022.08.10 [React] ๋๊ธ ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ (0) 2022.08.08 [React] ์๊ณ ๋ง๋ค๊ธฐ (0) 2022.08.08