๋น๋๊ธฐ ์์ ์ด ๋ง์ดํ ๋ฏธ๋์ ์๋ฃ/์คํจ์ ๊ทธ ๊ฒฐ๊ณผ๊ฐ
Promise๋ ๋ค์ 3๊ฐ์ง ์ค ํ๋์ ์ํ๋ฅผ ๊ฐ์ง
๋๊ธฐ(pending)
: ์ดํํ์ง๋, ๊ฑฐ๋ถํ์ง๋ ์์ ์ด๊ธฐ ์ํ์ดํ(fulfilled)
: ์ฐ์ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋จ๊ฑฐ๋ถ(rejected)
: ์ฐ์ฐ ์คํจsettled
์ locked-in
?์ด๋ค์ ์ํ๊ฐ ์๋๋ค!!
settled
pending
์ด ์๋ ๊ฒ!- ์ฆ,
fulfilled
๋์๊ฑฐ๋rejected
๋์๋ค๋ ์๋ฏธ
locked-in
- P์ settlement value๊ฐ Q๋ผ๊ณ ํ ๋, Q์ Promise๊ฐ
resolved
/rejected
๋์ด์ผ P์ settlement value๊ฐ ๊ฒฐ์ ๋จ
โ P๋ฅผ Q์ lock-in ํ๋ค!! (P๊ฐ locked-in ๋๋ ์ฃผ์ฒด)
Promise๋ ๋ค์ 2๊ฐ์ง ์ค ํ๋์ fate๋ฅผ ๊ฐ์ง
resolved
: Promise๋ฅผ resolve/reject ํ๋ ค ํด๋ ํจ๊ณผ๊ฐ ์๋ ์ํ
์ฆ, locked-in
์ด๊ฑฐ๋ fulfilled
, rejected
unresolved
: resolved
๋์ง ์์ ์ํ
โญ ์ค์ํ ๊ฑด,
fulfill
๊ณผresolve
๋ ๊ฐ์ ๋ง์ด ์๋!!
์ดํ
๋๋ ๊ฑฐ๋ถ
๋ ๋, then
๋ฉ์๋์ ์ํด ๋๊ธฐ์ด(ํ)์ ์ถ๊ฐ๋์๋ ์ฒ๋ฆฌ๊ธฐ๋ค์ด ํธ์ถ๋จnew Promise((resolveOuter) => {
resolveOuter(
new Promise((resolveInner) => {
setTimeout(resolveInner, 1000);
}),
);
});
resolveOuter
๊ฐ ๋๊ธฐ์ ์ผ๋ก ํธ์ถ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ํด๊ฒฐ๋์์ง๋ง,then()
, catch()
, finally()
์ฌ์ฉ ๊ฐ๋ฅthen()
์ต๋ 2๊ฐ์ ์ธ์๋ฅผ ๋ฐ์
โ ์ฒซ ๋ฒ์งธ ์ธ์ : Promise๊ฐ ์ดํ๋ ๊ฒฝ์ฐ์ ๋ํ ์ฝ๋ฐฑ ํจ์
โก ๋ ๋ฒ์งธ ์ธ์ : Promise๊ฐ ๊ฑฐ๋ถ๋ ๊ฒฝ์ฐ์ ๋ํ ์ฝ๋ฐฑ ํจ์
Promise์ ์ข
๋ฃ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฒด์ธ์์ ๋ค์ Promise์ settled
์ํ ๊ฒฐ์
Promise ํด๋์ค๋ ๋น๋๊ธฐ ์์ ์ ๋์์ฑ์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด 4๊ฐ์ง ์ ์ ๋ฉ์๋ ์ ๊ณต
Promise.all()
: ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ์ดํ๋๋ฉด ์ดํ๋๊ณ , ํ๋ก๋ฏธ์ค ์ค ํ๋๋ผ๋ ๊ฑฐ๋ถ๋๋ฉด ๊ฑฐ๋ถ๋จPromise.allSettled()
: ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ํด๊ฒฐ๋๋ฉด ์ดํ๋จPromise.any()
: ํ๋ก๋ฏธ์ค ์ค ํ๋๋ผ๋ ์ดํ๋๋ฉด ์ดํํ๊ณ , ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ๊ฑฐ๋ถ๋๋ฉด ๊ฑฐ๋ถ๋จPromise.race()
: ํ๋ก๋ฏธ์ค ์ค ํ๋๋ผ๋ ํด๊ฒฐ๋๋ฉด ํด๊ฒฐ๋จ (์ฆ, ํ๋๋ผ๋ ์ดํ๋๋ฉด ์ดํ๋๊ณ , ํ๋๋ผ๋ ๊ฑฐ๋ถ๋๋ฉด ๊ฑฐ๋ถ๋จ)์ ์ ๋ฉ์๋
Promise.reject(reason)
: ์ฃผ์ด์ง ์ฌ์ ๋ก ๊ฑฐ๋ถํ๋ Promise
๊ฐ์ฒด ๋ฐํPromise.resolve()
: ์ฃผ์ด์ง ๊ฐ์ผ๋ก ์ดํํ๋ Promise
๊ฐ์ฒด ๋ฐํthen
๋ฉ์๋๋ฅผ ๊ฐ์ง๋ ๊ฐ์ธ ๊ฒฝ์ฐ, Promise.resolve()
๊ฐ ๋ฐํํ๋ Promise๋ then
๋ฉ์๋๋ฅผ "๋ฐ๋ผ๊ฐ์" ์์ ์ ์ต์ข
์ํ ๊ฒฐ์ let myFirstPromise = new Promise((resolve, reject) => {
// ์ฐ๋ฆฌ๊ฐ ์ํํ ๋น๋๊ธฐ ์์
์ด ์ฑ๊ณตํ ๊ฒฝ์ฐ resolve(...)๋ฅผ ํธ์ถํ๊ณ , ์คํจํ ๊ฒฝ์ฐ reject(...)๋ฅผ ํธ์ถํฉ๋๋ค.
// ์ด ์์ ์์๋ setTimeout()์ ์ฌ์ฉํด ๋น๋๊ธฐ ์ฝ๋๋ฅผ ํ๋ด๋
๋๋ค.
// ์ค์ ๋ก๋ ์ฌ๊ธฐ์ XHR์ด๋ HTML5 API๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค.
setTimeout(function () {
resolve("์ฑ๊ณต!"); // ์! ๋ฌธ์ ์์!
}, 250);
});
myFirstPromise.then((successMessage) => {
// successMessage๋ ์์์ resolve(...) ํธ์ถ์ ์ ๊ณตํ ๊ฐ์
๋๋ค.
// ๋ฌธ์์ด์ด์ด์ผ ํ๋ ๋ฒ์ ์์ง๋ง, ์์์ ๋ฌธ์์ด์ ์คฌ์ผ๋ ์๋ง ๋ฌธ์์ด์ผ ๊ฒ์
๋๋ค.
console.log("์! " + successMessage);
});
new Promise()
๋ก ์๋ก์ด Promise ๊ฐ์ฒด ์์ฑresolve
๋ reject
๋ฅผ ํธ์ถํด์ ์ดํ/๊ฑฐ๋ถ ์ฌ๋ถ๋ฅผ ์๋ฆผsetTimeout()
๋น๋๊ธฐ ์์
์ด ์ ์คํ๋๋ฉด, resolve("์ฑ๊ณต!")
์ด Promise
๋ฅผ ์ดํ ์ํ๋ก ๋ณ๊ฒฝํ๋ฉฐ, "์ฑ๊ณต!"์ด๋ผ๋ ๋ฉ์์ง๋ฅผ ์ ๋ฌํจmyFirstPromise.then(...)
์ Promise
๊ฐ ์ดํ ์ํ๊ฐ ๋๋ฉด ์คํํ ์ฝ๋ ์ ์successMessage
๋ resolve("์ฑ๊ณต!")
ํธ์ถ์์ ์ ๋ฌ๋ ๊ฐ, ์ฆ "์ฑ๊ณต!"์ค๋ฅ ์คํ ์์
// ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ํด 'threshold' ๊ฐ์ ๋ฌด์์๋ก ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
const THRESHOLD_A = 8; // 0์ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค.
function tetheredGetNumber(resolve, reject) {
setTimeout(() => {
const randomInt = Date.now();
const value = randomInt % 10;
if (value < THRESHOLD_A) {
resolve(value);
} else {
reject(`Too large: ${value}`);
}
}, 500);
}
function determineParity(value) {
const isOdd = value % 2 === 1;
return { value, isOdd };
}
function troubleWithGetNumber(reason) {
const err = new Error("Trouble getting number", { cause: reason });
console.error(err);
throw err;
}
function promiseGetWord(parityInfo) {
return new Promise((resolve, reject) => {
const { value, isOdd } = parityInfo;
if (value >= THRESHOLD_A - 1) {
reject(`Still too large: ${value}`);
} else {
parityInfo.wordEvenOdd = isOdd ? "odd" : "even";
resolve(parityInfo);
}
});
}
new Promise(tetheredGetNumber)
.then(determineParity, troubleWithGetNumber)
.then(promiseGetWord)
.then((info) => {
console.log(`Got: ${info.value}, ${info.wordEvenOdd}`);
return info;
})
.catch((reason) => {
if (reason.cause) {
console.error("Had previously handled error");
} else {
console.error(`Trouble with promiseGetWord(): ${reason}`);
}
})
.finally((info) => console.log("All done"));
tetheredGetNumber()
๋ ๋๋ค ์ ์๋ฅผ 10์ผ๋ก ๋๋ ๋๋จธ์ง๊ฐ THRESHOLD_A
๋ณด๋ค ์์ผ๋ฉด resolve, ํฌ๋ฉด reject ๋๋ ํจ์THRESHOLD_A
๊ฐ 0์ด๋ฉด ํญ์ reject ๋จdetermineParity
๋ ํ์ ์ฌ๋ถ๋ฅผ ํ๋ณํ๋ ํจ์troubleWithGetNumber
๋ reason
์ ๋ง๋ ์ค๋ฅ๋ฅผ ๋์ง๋ ํจ์promiseGetWord
๋ ์ซ์์ ํ์ง ์ฌ๋ถ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ถ๊ฐ ์ ๋ณด๋ฅผ ๊ฒฐ์ ํ๋ ํจ์value
๊ฐ THRESHOLD_A - 1
๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด ์ค๋ฅparityInfo
๊ฐ์ฒด์ wordEventOdd
์์ฑ์ ์ถ๊ฐํ์ฌ isOdd
๊ฐ์ ๋ฐ๋ผ ๋ฌธ์์ด ๊ฐ์ ๊ฐ์ง๋๋ก ํจ