Promise
์๋ฐ์คํฌ๋ฆฝํธ Promise ๊ฐ์ฒด๋ ๋น๋๊ธฐ ์์ ์ ์ต์ข ์๋ฃ ๋๋ ์คํจ๋ฅผ ๋ํ๋ด๋ ๋ ์์ ์ธ ๊ฐ์ฒด์ด๋ค. ๋น๋๊ธฐ ์์ ์ด ๋๋ ๋๊น์ง ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ, ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๊ฒ ๋ค๋ '์ฝ์'์ ๋ฐํํ๋ค๋ ์๋ฏธ์์ Promise๋ผ ๋ช ๋ช ์ง์ด์ก๋ค๊ณ ํ๋ค.
Promise ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ค๋ฉด new ํค์๋์ Promise ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ด๋ Promise ์์ฑ์ ์์ ๋๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฃ๊ฒ ๋๋๋ฐ, ์ฒซ ๋ฒ์งธ ์ธ์๋ ์์ ์ด ์ฑ๊ณตํ์ ๋ ์ฑ๊ณต(resolve)์์ ์๋ ค์ฃผ๋ ๊ฐ์ฒด์ด๋ฉฐ, ๋ ๋ฒ์งธ ์ธ์๋ ์์ ์ด ์คํจํ์ ๋ ์คํจ(reject)์์ ์๋ ค์ฃผ๋ ์ค๋ฅ ๊ฐ์ฒด์ด๋ค.
const myPromise = new Promise((resolve, reject) => {
// ๋น๋๊ธฐ ์์
์ํ
const data = fetch('์๋ฒ๋ก๋ถํฐ ์์ฒญํ URL');
if(data)
resolve(data); // ๋ง์ผ ์์ฒญ์ด ์ฑ๊ณตํ์ฌ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด
else
reject("Error"); // ๋ง์ผ ์์ฒญ์ด ์คํจํ์ฌ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด
})
์ด๋ ๊ฒ ๋ง๋ค์ด์ง Promise ๊ฐ์ฒด๋ ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋ ์ดํ์ ๋ค์ ์์ ์ ์ฐ๊ฒฐ์์ผ ์งํํ ์ ์๋ค. ์์ ๊ฒฐ๊ณผ ๋ฐ๋ผ .then() ๊ณผ .catch() ๋ฉ์๋ ์ฒด์ด๋์ ํตํด ์ฑ๊ณต๊ณผ ์คํจ์ ๋ํ ํ์ ์ฒ๋ฆฌ๋ฅผ ์งํํ ์ ์๋ค.
๋ง์ผ ์ฒ๋ฆฌ๊ฐ ์ฑ๊ณตํ์ฌ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด ๋ด๋ถ์์ resolve(data)๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด, ๋ฐ๋ก .then()์ผ๋ก ์ด์ด์ ธ then ๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์์์ ์ฑ๊ณต์ ๋ํ ์ถ๊ฐ ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค. ์ด๋ ํธ์ถํ resolve() ํจ์์ ๋งค๊ฐ๋ณ์์ ๊ฐ์ด then ๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์ ์ธ์๋ก ๋ค์ด๊ฐ then ๋ฉ์๋ ๋ด๋ถ์์ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด ๋ด๋ถ์์ ๋ค๋ฃฌ ๊ฐ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
๋ฐ๋๋ก ์ฒ๋ฆฌ๊ฐ ์คํจํ์ฌ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด ๋ด๋ถ์์ reject("Error") ๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด, ๋ฐ๋ก .catch()๋ก ์ด์ด์ ธ catch ๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์์์ ์ฑ๊ณต์ ๋ํ ์ถ๊ฐ ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค.
myPromise
.then((value) => { // ์ฑ๊ณต์ ์ผ๋ก ์ํํ์ ๋ ์คํ๋ ์ฝ๋
console.log("Data: ", value); // ์์์ return resolve(data)์ data๊ฐ์ด ์ถ๋ ฅ๋๋ค
})
.catch((error) => { // ์คํจํ์ ๋ ์คํ๋ ์ฝ๋
console.error(error); // ์์์ return reject("Error")์ "Error"๊ฐ ์ถ๋ ฅ๋๋ค
})
.finally(() => { // ์ฑ๊ณตํ๋ ์คํจํ๋ ๋ฌด์กฐ๊ฑด ์คํ๋ ์ฝ๋
})
์์ ๊ฐ์ด ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ๋ณ์์ ๋ฐ๋ก ํ ๋นํ ์๋ ์์ง๋ง, ๋ณดํต์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๋ ํจ์๋ก ๊ฐ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
// ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์ ์์ฑ
function myPromise() {
return new Promise((resolve, reject) => {
if (/* ์ฑ๊ณต ์กฐ๊ฑด */) {
resolve(/* ๊ฒฐ๊ณผ ๊ฐ */);
} else {
reject(/* ์๋ฌ ๊ฐ */);
}
});
}
// ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์ ์ฌ์ฉ
myPromise()
.then((result) => {
// ์ฑ๊ณต ์ ์คํํ ์ฝ๋ฐฑ ํจ์
})
.catch((error) => {
// ์คํจ ์ ์คํํ ์ฝ๋ฐฑ ํจ์
});
ํจ์๋ฅผ ๋ง๋ค๊ณ ๊ทธ ํจ์๋ฅผ ํธ์ถํ๋ฉด ํ๋ก๋ฏธ์ค ์์ฑ์๋ฅผ return ํจ์ผ๋ก์, ๊ณง๋ฐ๋ก ์์ฑ๋ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ํจ์ ๋ฐํ๊ฐ์ผ๋ก ์ป์ด ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ด๋ค. ํ๋ก๋ฏธ์ค๋ฅผ ์์ฑํ์ฌ ๋ฐํํ๋ ํจ์๋ฅผ 'ํ๋ก๋ฏธ์ค ํฉํ ๋ฆฌ ํจ์' ๋ผ๊ณ ๋ถ๋ฆฌ์ฐ๊ธฐ๋ ํ๋ค.
๊ทธ๋ฐ๋ฐ ์ฝ๋ฐฑ ๋ชป์ง์๊ฒ ํ๋ก๋ฏธ์ค์ then() ๋ฉ์๋๊ฐ ์ง๋์น๊ฒ ์ฒด์ธ๋์ด ๋ฐ๋ณต๋๋ฉด ์ฝ๋๊ฐ ์ฅํฉํด์ง๊ณ ๊ฐ๋ ์ฑ์ด ๊ต์ฅํ ๋จ์ด์ง ์๊ฐ ์๋ค. ์ด๋ฅผ ๋๋ค์ ๊ทน๋ณตํ๊ธฐ ์ํด ๋์จ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์ธ๋ ๋ฌธ๋ฒ์ด ์๋๋ฐ ๋ฐ๋ก async/await ํค์๋์ด๋ค.
Async/Await
async/await ํค์๋๋ ES8์์ ๋์ ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฌธ๋ฒ์ผ๋ก, ํ๋ก๋ฏธ์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง then๊ณผ catch ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋น๋๊ธฐ ์์ ์ ์ํํ ์ ์๋ค. async/await ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์์ ์ ๋ง์น ๋๊ธฐ ์์ ์ฒ๋ผ ์ธ ์ ์์ด์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ์ด ์ข์์ง๊ฒ ๋๋ค.
์ฌ์ฉ๋ฒ์ function ํค์๋ ์์ async๋ฅผ ๋ถ์ด๊ณ , ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋๋ ๋ถ๋ถ ์์ await๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
// ๊ธฐ์กด Promise.then() ํ์
function main() {
delay(1000)
.then(() => {
return delay(2000);
})
.then(() => {
return Promise.resolve('๋');
})
.then(result => {
console.log(result);
});
}
// async/await ๋ฐฉ์
async function main() {
await delay(1000);
await delay(2000);
const result = await Promise.resolve('๋');
console.log(result);
}
async ํค์๋๋ ์ด๋ ต๊ฒ ์๊ฐํ ํ์์์ด await๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ ์ธ๋ฌธ ์ ๋๋ก ์ดํดํ๋ฉด ๋๋ค. ์ฆ, function ์์ async์ ๋ถ์ฌ์ค์ผ๋ก์จ, ํจ์๋ด์์ await ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. ์ด๋ await ํค์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ฐ๋์ async function ์ ์๊ฐ ๋์ด ์์ด์ผ ํ๋ค๋ ๋ง๊ณผ ๊ฐ๋ค.
async function์ ์ด๋ค ๊ฐ์ ๋ฆฌํดํ๋ ๋ฌด์กฐ๊ฑด ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ก ๊ฐ์ธ์ ธ ๋ฐํ๋๋ค๋ ํน์ง์ด ์๋ค.
๊ธฐ์กด์๋ await ํค์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ฌด์กฐ๊ฑด async function๋ฅผ ์ ์ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ํจ์๋ก ๊ฐ์ธ์ง ์์๋ ๋ ์ฝ๋๋ฅผ ์ด๊ฑฐ์ง๋ก ํจ์๋ก ๊ฐ์ธ IIFE๋ก ํธ์ถํ๋ ์์ผ๋ก ์ฌ์ฉํด์๋ค. ์ด๋ฌํ ํ๊ณ์ ๋๋ฌธ์ Top-level await ๋ async ํจ์๋ ๋ชจ๋ ์ธ๋ถ์์๋ await ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ํธ์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์๋ค. ์ด ๊ธฐ๋ฅ์ ES2022์ ์ถ๊ฐ๋์์ผ๋ฉฐ, ํ์ฌ ๋๋ถ๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ์ Node.js์์ ์ง์๋๋ค.
// ๊ธฐ์กด์ async function
(async function func1() {
const res = await fetch(url); // ์์ฒญ์ ๊ธฐ๋ค๋ฆผ
const data = await res.json(); // ์๋ต์ JSON์ผ๋ก ํ์ฑ
console.log(data);
})();
// Top Level์์ async funciton ์ ์์์ด ๊ณง๋ฐ๋ก await ํค์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค
const res = await fetch(url); // ์์ฒญ์ ๊ธฐ๋ค๋ฆผ
const data = await res.json(); // ์๋ต์ JSON์ผ๋ก ํ์ฑ
console.log(data);
์ถ์ฒ:
๐ ์๋ฐ์คํฌ๋ฆฝํธ Promise ๊ฐ๋ & ๋ฌธ๋ฒ ์ ๋ณตํ๊ธฐ
์ฝ๋ฐฑ ์ง์ฅ์ ํ์ถํ๋ ์๋ก์ด ๋ฌธ๋ฒ ์๋ฐ์คํฌ๋ฆฝํธ์์ '๋น๋๊ธฐ ์ฒ๋ฆฌ' ๋ ํ์ฌ ์คํ์ค์ธ ์์ ๊ณผ๋ ๋ณ๋๋ก ๋ค๋ฅธ ์์ ์ ์ํํ๋ ๊ฒ์ ๋งํ๋ค. ์๋ฅผ ๋ค์ด ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ์์ ์ ์๊ฐ
inpa.tistory.com
๐ ์๋ฐ์คํฌ๋ฆฝํธ Async/Await ๊ฐ๋ & ๋ฌธ๋ฒ ์ ๋ณต
์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ฒ๋ฆฌ 3๊ฐ์ง ๋ฐฉ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ธฐ ๋๋ฌธ์ ๋ฉํฐ ์์ ์ ํ๊ธฐ ์ํด์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์์ด ์์ฃผ ์ฐ์ธ๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋์๋๊ธฐ
inpa.tistory.com
'Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์๋ฐ์คํฌ๋ฆฝํธ์ ES6 ~ES2014 (2) | 2023.12.07 |
|---|---|
| ์๋ฐ์คํฌ๋ฆฝํธ์ ํธ์ถ ์คํ๊ณผ ์ด๋ฒคํธ ๋ฃจํ (1) | 2023.11.18 |
| ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ (2) | 2023.11.17 |