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);
});
ํ์ ํฌ๊ธฐ๋ก ์๋ผ ๋จน๋ ๋ฆฌ์กํธ๋ฅผ ํ์ตํ๋ฉฐ ๊ฐ์ธ์ ์ผ๋ก ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.