
์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ์ Promise
์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ Promise์ ๋ํด ์ฝ๊ฒ ์ ๋ฆฌํด๋ณด์!
1. ์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ฒ๋ฆฌ ; ์ฝ๋ฐฑ ํจ์(Callback)
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธ ์ค๋ ๋๋ก ์๋ํ๋ค.
๊ทธ๋์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์
(์: ์๋ฒ ์์ฒญ, ํ์ผ ์ฝ๊ธฐ ๋ฑ)์ ๊ทธ๋ฅ ์คํํ๋ฉด ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถฐ๋ฒ๋ฆด ์ ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋ฑ์ฅํ๋ค.
๋ํ์ ์ธ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ ๋ฐ๋ก ์ฝ๋ฐฑ ํจ์
// ์ฝ๋ฐฑํจ์๋ฅผ ์ฌ์ฉํด์, ๋น๋๊ธฐํจ์ ์์์ ์ฝ๋ฐฑ์ ํธ์ถ
function add(a, b, callback) {
setTimeout(() => {
const sum = a + b;
callback(sum);
}, 3000);
}
add(1, 2, (value) => {
console.log(value); // 3์ด ํ 3 ์ถ๋ ฅ
});
- setTimeout์ ๋น๋๊ธฐ ์์ ์ ๋ชจ๋ฐฉํ๊ธฐ ์ํด ์ฌ์ฉํจ.
- 3์ด ํ์ ๋ ์๋ฅผ ๋ํ ๊ฐ์ ์ฝ๋ฐฑ ํจ์์ ๋๊น.
์ฝ๋ฐฑ ์ง์ฅ (Callback Hell)
์ฝ๋ฐฑ์ ์ฐ์์ ์ผ๋ก ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ์ ์ ์ค์ฒฉ๋๊ณ ์ฝ๊ธฐ ์ด๋ ต๊ฒ ๋ณํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ฅผ '์ฝ๋ฐฑ ์ง์ฅ'์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
// ์์ ์ฃผ๋ฌธํ๊ธฐ
function orderFood(callback) {
setTimeout(() => {
const food = "๋ก๋ณถ์ด";
callback(food);
}, 3000);
}
// ์์ ์ํ๊ธฐ
function cooldownFood(food, callback) {
setTimeout(() => {
const cooldownedFood = `์์ ${food}`;
callback(cooldownedFood);
}, 2000);
}
// ์์ ๋๋ํ๊ธฐ
function freezeFood(food, callback) {
setTimeout(() => {
const freezedFood = `๋๋๋ ${food}`;
callback(freezedFood);
}, 1500);
}
// ์ฝ๋ฐฑ ์ง์ฅ ๋ฐ์
orderFood((food) => {
console.log(food);
cooldownFood(food, (cooldownedFood) => {
console.log(cooldownedFood);
freezeFood(cooldownedFood, (freezedFood) => {
console.log(freezedFood);
});
});
});
- orderFood โ cooldownFood โ freezeFood ์์๋ก ์์ ์ด ์งํ๋ผ์ผ ํ๋๋ฐ, ์ฝ๋ฐฑ ์์ ์ฝ๋ฐฑ, ๋ ๊ทธ ์์ ์ฝ๋ฐฑ์ ๋ฃ์ด์ผ ํด์ ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ค.
โก๏ธ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ ๋ฐ๋ก Promise
1. Promise๋ ๋ฌด์์ธ๊ฐ?
Promise๋ '๋ฏธ๋์ ์๋ฃ๋ ์๋, ์คํจํ ์๋ ์๋ ์์
'์ ๋ํ๋ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด
๋น๋๊ธฐ ์์
์ ๋ณด๋ค ๊น๋ํ๊ฒ ๋ค๋ฃจ๊ธฐ ์ํด ๋ง๋ค์ด์ก๋ค.
Promise๋ ์ธ ๊ฐ์ง ์ํ๋ฅผ ๊ฐ์ง ์ ์๋ค.
pending (๋๊ธฐ) | ์์ ์ด ์์ง ์๋ฃ๋์ง ์์ ์ํ |
fulfilled (์ฑ๊ณต) | ์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ์ํ (resolve ํธ์ถ) |
rejected (์คํจ) | ์์ ์ด ์คํจํ ์ํ (reject ํธ์ถ) |
์ฆ, Promise๋ ๋น๋๊ธฐ ์์ ์ ์์ํ๊ณ , ๊ฒฐ๊ณผ๊ฐ ์ฑ๊ณต์ด๋ ์คํจ๋ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ์ปจํ ์ด๋๋ค.
2. Promise ๊ธฐ๋ณธ ๊ตฌ์กฐ
Promise ๊ฐ์ฒด๋ ๋ค์์ฒ๋ผ ์์ฑํ๋ค.
const promise = new Promise((resolve, reject) => {
// ๋น๋๊ธฐ ์์
์คํ
setTimeout(() => {
const success = true;
if (success) {
resolve("์์
์ฑ๊ณต!");
} else {
reject("์์
์คํจ!");
}
}, 2000);
});
- resolve(value): ์์ ์ด ์ฑ๊ณตํ์ ๋ ํธ์ถํ๋ ํจ์
- reject(error): ์์ ์ด ์คํจํ์ ๋ ํธ์ถํ๋ ํจ์
3. Promise ์ฌ์ฉํ๊ธฐ - then๊ณผ catch
Promise๋ then๊ณผ catch ๋ฉ์๋๋ฅผ ํตํด ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฃฌ๋ค.
- .then (์ฑ๊ณตํ์ ๋ ์คํํ ์ฝ๋ฐฑ)
- .catch (์คํจํ์ ๋ ์คํํ ์ฝ๋ฐฑ)
promise
.then((value) => {
console.log(value); // "์์
์ฑ๊ณต!" ์ถ๋ ฅ
})
.catch((error) => {
console.log(error); // ์คํจํ์ ๊ฒฝ์ฐ ์๋ฌ ์ถ๋ ฅ
});
๐ก์์์ฝ๋ ์ซ์์ 10 ๋ํ๊ธฐ (add10 ํจ์)
function add10(num) {
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
if (typeof num === "number") {
resolve(num + 10);
} else {
reject("num์ด ์ซ์๊ฐ ์๋๋๋ค");
}
}, 2000);
});
return promise;
}
- num์ด ์ซ์์ด๋ฉด 2์ด ํ์ 10์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
- num์ด ์ซ์๊ฐ ์๋๋ฉด ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐํ
const p = add10(0);
p.then((result) => {
console.log(result); // 10
return add10(result); // 10 + 10
}).then((result) => {
console.log(result); // 20
return add10(result); // 20 + 10
}).then((result) => {
console.log(result); // 30
}).catch((error) => {
console.log(error); // ์๋ฌ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ ์คํ
});
- ์ฒ์ 0์ ๋๊ธฐ๊ณ 10์ ๋ํ 10์ ๋ฐํ
- ์ด์ด์ 10์ ๋ฐ์ ๋ 10์ ๋ํ 20์ ๋ฐํ
- ๋ ์ด์ด์ 20์ ๋ฐ์ 10์ ๋ํ 30์ ๋ฐํ
- ์ค๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด .catch ๋ธ๋ก์์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌ
5. Promise ์ฒด์ด๋ (Chaining)
Promise์ ํฐ ์ฅ์ ์ค ํ๋๋ then์ ์ฐ์ํด์ ์ด์ด๋ถ์ผ ์ ์๋ค๋ ์ ์ด๋ค.
โก๏ธ Promise ์ฒด์ด๋
๊ฐ then์ ์ด์ then์ด ๋ฐํํ ๊ฐ์ ๋ค์ then์ผ๋ก ๋๊ฒจ์ค๋ค.
add10(5)
.then(result => add10(result))
.then(result => add10(result))
.then(result => console.log(result)) // ์ต์ข
๊ฒฐ๊ณผ ์ถ๋ ฅ
.catch(error => console.log(error));
- ๋น๋๊ธฐ ์์ ์ด ์์๋๋ก ๊น๋ํ๊ฒ ์ด์ด์ง๋ค.
- ์ค๊ฐ์ ํ๋๋ผ๋ ์คํจํ๋ฉด ๋ฐ๋ก .catch()๋ก ๋์ด๊ฐ๋ค.
๐ก์์ฝ
- ์ฝ๋ฐฑ์ ๊ฐ๋จํ์ง๋ง, ์ฝ๋ฐฑ ์ง์ฅ์ ๋น ์ง ์ํ์ด ์๋ค.
- Promise๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์ฝ๋๋ฅผ ํจ์ฌ ์ฝ๊ธฐ ์ฝ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
- async/await๋ฅผ ์ฌ์ฉํ๋ฉด Promise๋ฅผ ๋ ๊น๋ํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. (to be continued..)
- Promise๋ ๋น๋๊ธฐ ์์ ์ ๋ค๋ฃจ๋ ๊ฐ์ฒด์ด๋ค.
- resolve์ reject๋ก ์ฑ๊ณต๊ณผ ์คํจ๋ฅผ ๊ตฌ๋ถํ๋ค.
- then์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ด์ด๋ถ์ด๊ณ , catch๋ก ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
- Promise ์ฒด์ด๋์ ํตํด ๋ณต์กํ ๋น๋๊ธฐ ํ๋ฆ๋ ๊น๋ํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
์ง๋ฌธ์ด๋ ์ถ๊ฐ ์ค๋ช
์ด ํ์ํ๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์! ๐