๋๊ธฐ & ๋น๋๊ธฐ ๊ธ์์ ๋ฑ์ฅํ ์ฝ๋ฐฑ ์ง์ฅ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ Promise ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
Promise๋?
: ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ๋ฅผ ๋๋ ๊ฐ์ฒด์ด๋ค. ์ฝ๋ฐฑ์ ์ค์ง์ด์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐฉ์งํด์ค๋ค.
์ฐ์ , ๋น๋๊ธฐ์์ ์ด ๊ฐ์ง ์ ์๋ ์ํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋๊ธฐ(Pending): ๋น๋๊ธฐ ์ํ๊ฐ ์์ ์ค์ด๊ฑฐ๋ ์์ํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ
- ์ดํ(Fulfilled): ๋น๋๊ธฐ ์ํ๊ฐ ์ ์์ ์ผ๋ก ์งํ๋ ์ํ
- ๊ฑฐ๋ถ(Rejected): ๋ฒ๊ทธ, ๋๋ ์คํจํ ์ํ๋ก ๋น๋๊ธฐ ์์ ์ด ์ ์์ ์ผ๋ก ์งํ๋์ง ์์ ์ํ
- resolve: ๋๊ธฐ => ์ดํ
- reject: ๋๊ธฐ => ๊ฑฐ๋ถ
function isPositiveP(number) {
const executor = (resolve, reject) => {
setTimeout(() => {
if (typeof number === "number") {
resolve(number >= 0 ? "์์" : "์์");
} else {
reject("์ฃผ์ด์ง ๊ฐ์ด ์ซ์ํ ๊ฐ์ด ์๋๋๋ค.");
}
}, 2000);
};
const asyncTask = new Promise(executor); // executor๋ฅผ ๋ด์ Promise ๊ฐ์ฒด ์์ฑ
return asyncTask;
}
const res = isPositiveP(101);
res
.then((res) => {
console.log(`์์
์ฑ๊ณต : ${res}`); // resolve ์ฝ๋ฐฑํจ์์ ๊ฐ ์คํ
})
.catch((err) => {
console.log(`์์
์คํจ : ${err}`); // reject ์ฝ๋ฐฑํจ์์ ๊ฐ ์คํ
});
executor๋ผ๋ ์์์์ resolve, reject๋ฅผ ์ฌ์ฉํ์ฌ setTimeout๋ฅผ ์คํํ๋ค.
resolve๋ ๋น๋๊ธฐ ์์ ์ด ์ฑ๊ณตํ์ ๋์ ์ฝ๋ฐฑํจ์, reject๋ ๋น๋๊ธฐ ์์ ์ด ์คํจํ์ ๋์ ์ฝ๋ฐฑํจ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ฌ๊ธฐ์ executor()๊ฐ ๋น๋๊ธฐ ์์
์ ์ค์ ๋ก ์ํํ๋ ๊ฒ์ด๋ค.
res๋ Promise ๊ฐ์ฒด๋ฅผ return ๋ฐ๊ฒ ๋๋ฏ๋ก, ๋ฐํ๋ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ then๊ณผ catch๋ฅผ ํตํด resolve์ reject์ ๊ฒฐ๊ณผ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
Promise๋ก ์ฝ๋ฐฑ์ง์ฅ์ ํ์ถํ๋ ๋ฐฉ๋ฒ
# Case 1. ์ฝ๋ฐฑ ์ง์ฅ
function taskA(a, b, cb) {
setTimeout(() => {
const res = a + b;
cb(res);
}, 3000);
}
function taskB(a, cb) {
setTimeout(() => {
const res = a * 2;
cb(res);
}, 1000);
}
function taskC(a, cb) {
setTimeout(() => {
const res = a * -1;
cb(res);
}, 2000);
}
taskA(3, 4, (a_res) => {
console.log(`A TASK : ${a_res}`);
taskB(a_res, (b_res) => {
console.log(`B TASK : ${b_res}`);
taskC(b_res, (c_res) => {
console.log(`C TASK : ${c_res}`);
});
});
});
# Case 2. Promise๋ฅผ ์ด์ฉํ ์ฝ๋ฐฑ ์ง์ฅ ํ์ถ
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 Promise((resolve, reject) => {
setTimeout(() => {
const res = a * -1;
resolve(res);
}, 2000);
});
}
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(b_res);
})
.then((c_res) => {
console.log(`C RESULT : ${c_res}`);
});
Promise ๊ฐ์ฒด๋ฅผ ํตํด ์์ฒญ์ด ์ฑ๊ณตํ๋ฉด, resolve ์ธ์๋ฅผ ํตํด callback ํจ์๊ฐ ํธ์ถ๋๊ณ ํด๋น ์์ ์ด ๋ฐ๋ณต๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ ๊ฒ then์ ์ฌ์ฉํ์ฌ ์๋๋ก ์ฎ์ด ๋๊ฐ๋ ๊ฒ์ then chaining์ด๋ผ๊ณ ํ๋ค.
- then chaining์ ์ฌ์ฉํ ์ฝ๋๋ ์ฝ๋ฐฑ ์ง์ฅ ์ฝ๋๋ณด๋ค ์ง๊ด์ ์ด๋ฉฐ, ๊ฐ์์ฑ์ด ์ข๋ค.
- ์ฌ๋ฌ ๊ฐ์ chain ์ค ํ๋๋ผ๋ reject๋๋ฉด ๋ฐ๋ก ๋ง์ง๋ง์ ๋ฌ๋ฆฐ catch()๋ก ๋ด๋ ค๊ฐ์ (ํด๋น ์ฝ๋์ reject ์ธ์์ ๋ง์ง๋ง ์ฝ๋์ .catch(~~)๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.) ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ค.
- ๋ถํ์ํ๊ฒ ๋๋จธ์ง promise๊น์ง ์ฐจ๋ก์ฐจ๋ก ํ์ธํ์ง ์๋๋ค.
- then์์ ๋์ ๋ค์ ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ค๊ฐ์ ์ฝ์
ํ ์ ๋ ์๋ค.
# Case3. ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ค๊ฐ์ ์ฝ์ ํ์ฌ ๋ค๋ฅธ ์์ ์ ์ํํ๋ ์์ -
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 Promise((resolve, reject) => { setTimeout(() => { const res = a * -1; resolve(res); }, 2000); }); } const PromiseResult2 = taskA(5, 1).then((a_res) => { console.log(`A RESULT : ${a_res}`); return taskB(a_res); }); console.log("๋ค๋ฅธ์์ 1"); console.log("๋ค๋ฅธ์์ 2"); console.log("๋ค๋ฅธ์์ 3"); console.log("๋ค๋ฅธ์์ 4"); PromiseResult2 .then((b_res) => { console.log(`B RESULT : ${b_res}`); return taskC(b_res); }) .then((c_res) => { console.log(`C RESULT : ${c_res}`); });
'๐ฆ Computer Language > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] var๋ฅผ ์ง์ํด์ผํ๋ ์ด์ (0) | 2022.03.13 |
---|---|
[JavaScript] async & await | ๋น๋๊ธฐ ์ฒ๋ฆฌ (0) | 2022.03.13 |
[JavaScript] ๋๊ธฐ & ๋น๋๊ธฐ (0) | 2022.03.04 |
[JavaScript] spread | ์ ๊ฐ ์ฐ์ฐ์ (0) | 2022.03.03 |
[JavaScript] ๋น๊ตฌ์กฐํ ํ ๋น ๊ทธ๋ฆฌ๊ณ SWAP (0) | 2022.03.03 |