
Promise๋ JavaScript ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ด๋ค. ์ฌ๊ธฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ํน์ ์ฝ๋์ ์คํ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์ฝ๋๋ฅผ ๋จผ์ ์ํํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ฑ์ด๋ค.
ํ๋ก๋ฏธ์ค๋ new Promise()๋ก ํ๋ก๋ฏธ์ค๋ฅผ ์์ฑํ๋ฉฐ Pending, Fulfilled, Rejected์ 3๊ฐ์ง ์ํ๋ฅผ ๊ฐ๋๋ค.

์ฝ๋ฐฑํจ์๋ฅผ ์ด์ฉํด ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ฑ๊ณต๊ณผ ์คํจ๋ก ํธ๋ค๋งํด๋ณด์.
function isPositive(number, resolve, reject){
setTimeout(() => {
if(typeof number === "number"){
// ์ฑ๊ณต -> resolve
resolve(number >= 0 ? "์์" : "์์");
} else {
// ์คํจ -> reject
reject("์ฃผ์ด์ง ๊ฐ์ด ์ซ์ํ ๊ฐ์ด ์๋๋๋ค.");
}
}, 2000);
}
isPositive(
10,
(res) => {
console.log("์ฑ๊ณต์ ์ผ๋ก ์ํ๋จ: ", res);
},
(err) => {
console.log("์คํจํ์์: ", err);
}
);
// ์ฑ๊ณต์ ์ผ๋ก ์ํ๋จ: ์์
function isPositiveP(number){
// executor๋ ๋น๋๊ธฐ ์์
์ ์ค์ง์ ์ผ๋ก ์ํํ๋ ์คํ์ ํจ์
const executor = (resolve, reject) => {
setTimeout(() => {
if(typeof number === "number"){
// ์ฑ๊ณต
resolve(number >= 0 ? "์์" : "์์");
} else {
// ์คํจ
reject("์ฃผ์ด์ง ๊ฐ์ด ์ซ์ํ ๊ฐ์ด ์๋๋๋ค.");
}
}, 2000);
}
const asyncTask = new Promise(executor);
return asyncTask;
}
const res = isPositiveP(101);
res
.then((res) => {
console.log("์์
์ฑ๊ณต: ", res);
})
.catch((err) => {
console.log("์์
์คํจ: ", err);
});
// ์์
์ฑ๊ณต: ์์
๐ ์คํ์ํค๊ธฐ
1. ๋น๋๊ธฐ ์์ ์ ์ค์ง์ ์ผ๋ก ์ํํ๋ ์คํ์ ํจ์,executor.
2. ๋น๋๊ธฐ ์์ ์์ฒด์ธ Promise๋ฅผ ์ ์ฅํ ์์asyncTask๋ฅผ ์ ์ธํ์ฌnew Promise()๋ก Promise ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
3.new Promise(executor)์ ๊ฐ์ด, Promise ๊ฐ์ฒด์ ์์ฑ์๋ก ๋น๋๊ธฐ ์์ ์ ์ค์ง์ ์ธ ์คํ์ ํจ์์ธexecutor๋ฅผ ๋๊ฒจ์ค๋ค.
4.executor๊ฐ ์คํ๋๋ค.
โจ Promise ๊ฐ์ฒด์ ๋น๋๊ธฐ ๊ฒฐ๊ณผ๊ฐ ์ฌ์ฉํ๊ธฐ
1. res๋ ๋ฐํ๋ฐ์ Promise ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ํresolve๋reject๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
2. Promise ๊ฐ์ฒด์ ๋ฉ์๋then๊ณผcatch
โ resolve๋ฅผ ์ฌ์ฉํ์ ๋, ์ ๋ฌํ ๊ฒฐ๊ณผ๊ฐ์then์ฝ๋ฐฑํจ์์์ ๋ฐ์์ฌ ์ ์๋ค.
โ reject๋ฅผ ์ฌ์ฉํ์ ๋๋catch๋ฉ์๋์์ ๋ฐ์์ฌ ์ ์๋ค.
function taskA(a, b) {
return new Promise((resolve, reject)=>{
setTimeout(()=>{
const res = a + b;
resolve(res);
}, 3000);
});
}
function taskB(a) {
return new Promise((resolve, reject) => {
setTimeout(() => {
const res = a * 2;
resolve(res);
}, 1000);
});
}
function taskC(a) {
return new Prmoise((resolve, reject) => {
setTimeout(() => {
const res = a * -1;
resolve(res);
}, 2000);
})
}
// then ์ฒด์ด๋
taskA(5,1)
.then((a_res) => {
console.log("A RESULT: ", a_res);
return taskB(a_res);
})
.then((b_res) => {
console.log("B RESULT: ", b_res);
return taskC(c_res);
})
.then((c_res) => {
console.log("C RESULT: ", c_res);
});
// A RESULT: 6
// B RESULT: 12
// C RESULT: -12
๐ Promise๋ฅผ ๋ฐํํ๋ ํจ์๋ก ๋ฐ๊พผ ์ด์
function taskA(a, b) { const executorA = (resolve, reject)=>{ setTimeout(()=>{ const res = a + b; resolve(res); // resolve์ฌ์ฉํ ๊ฒ์ด๋ฏ๋ก ์ด์ ์ cb์ resolve๋ก ๋ฐ๊ฟ }, 3000); }; return new Promise(executorA); }์์ ๊ฐ์ ๋ฐฉ์์ ํจ์๋ฅผ ์๋์ ๊ฐ์ด Promise๋ฅผ ๋ฐ๋ก ๋ฐํํ๋ ํจ์๋ก ๋ฐ๊พธ์ด์ฃผ์๋ค.
function taskA(a, b) { return new Promise((resolve, reject)=>{ setTimeout(()=>{ const res = a + b; resolve(res); }, 3000); }); }์๋ํ๋ฉด ์ด๋ค ํจ์๊ฐ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ์, ํด๋น ํจ์๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ํ, ๋ฐํํ Promise ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ์
then๊ณผcatch๋ก ์ด์ฉํ ์ ์๊ฒ ๋ง๋ค๊ฒ ๋ค๋ ๊ฒ์ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๐ then ์ฒด์ด๋์ ๊ณผ์
1.taskA(5, 1)์ Promise ๊ฐ์ฒด๋ฅผ ์ ๋ฌ ๋ฐ๋๋ค.
2. Promise ๊ฐ์ฒด์then๋ฉ์๋๋ฅผ ์ฌ์ฉํด taskB๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์ ๋ฌํ๋ค.
3. B์ Promise๋ฅผ ๋ฐ๋๋ค.taskA(5, 1).then((a_res) => { console.log("A RESULT: ", a_res); return taskB(a_res); })
- C์ Promise๋ฅผ ๋ฐ๋๋ค.
.then((b_res) => { console.log("B RESULT: ", b_res); return taskC(c_res); })
Promise๋ฅผ ์ฌ์ฉํ์ฌ >๋ชจ์์ผ๋ก ์ฝ๋๊ฐ ์์ผ๋ก ๊ณ์ ๋ฐ๋ ค๋ค์ด๊ฐ์ง ์๊ณ ,
]๋ชจ์์ฒ๋ผ ์ผ๋ ฌ๋ก ๋์ดํ ์ ์๋ค.
taskA(4, 5, (a_res) => {
console.log("A TASK RESULT:", a_res);
taskB(a_res, (b_res) => {
console.log("B TASK RESULT:", b_res);
taskC(b_res, (c_res) => {
console.log("C TASK RESULT:", c_res);
});
});
});
taskA(5,1)
.then((a_res) => {
console.log("A RESULT: ", a_res);
return taskB(a_res);
})
.then((b_res) => {
console.log("B RESULT: ", b_res);
return taskC(c_res);
})
.then((c_res) => {
console.log("C RESULT: ", c_res);
});
ํ์ ํฌ๊ธฐ๋ก ์๋ผ ๋จน๋ ๋ฆฌ์กํธ๋ฅผ ํ์ตํ๋ฉฐ ๊ฐ์ธ์ ์ผ๋ก ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.