๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ ์ฑ๊ณผ ์๋ฌ ์ฒ๋ฆฌ์ ํ๊ณ ๋๋ฌธ์ ES6์์ ๋์ ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ด๋ค.
๐งฉ ํ๋ก๋ฏธ์ค์ ์ํ
ํ๋ก๋ฏธ์ค ์ํ | ์ํ | ์ค๋ช |
---|---|---|
pending | ํ๋ก๋ฏธ์ค ์์ฑ์ ํจ์๋ก ์ธํด ์ธ์คํด์ค๊ฐ ์์ฑ๋ ์ํ | ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ํ๋์ง ์์ ์ํ |
fulfilled | ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ฑ๊ณตํ ์ํ | resolve ํจ์๋ฅผ ํธ์ถํ๋ค. |
rejected | ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์คํจํ ์ํ | reject ํจ์๋ฅผ ํธ์ถํ๋ค. |
๐งฉ pending ์ํ
const isChecked = true;
// ํ๋ก๋ฏธ์ค ์ธ์คํด์ค ์์ฑ
const promise = new Promise((resolve, reject) => {
// pending ์ํ๋ฅผ ํ์ธํ๊ธฐ ์ํด ์๋์ฝ๋ ์ฃผ์์ผ๋ก ์ฒ๋ฆฌ
// if(isChecked) resolve("Success");
// else reject("Fail");
});
// ๊ฒฐ๊ณผ : Promise {<pending>}
console.log(promise);
๐งฉ fulfilled ์ํ
// ์ฑ๊ณต๊ณผ ์คํจ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ณ์ ์ด๊ธฐํ
const isChecked = true;
const promise = new Promise((resolve, reject) => {
// ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ฑ๊ณตํ๋๋ก ์กฐ๊ฑด๋ฌธ์ผ๋ก ์คํ
if(isChecked) resolve("Success");
else reject("Fail");
});
// ๊ฒฐ๊ณผ : Promise {<fulfilled>: 'Success'}
console.log(promise);
๐งฉ rejected ์ํ
// ์ฑ๊ณต๊ณผ ์คํจ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ณ์ ์ด๊ธฐํ
const isChecked = false;
const promise = new Promise((resolve, reject) => {
// ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์คํจํ๋๋ก ์กฐ๊ฑด๋ฌธ ์คํ
if(isChecked) resolve("Success");
else reject("Fail");
});
// ๊ฒฐ๊ณผ : Promise {<rejected>: 'Fail'}
console.log(promise);
๐ฅ ์กฐ๊ฑด๋ฌธ์ผ๋ก ์ฒ๋ฆฌ ๊ณผ์ ์ ๋๋์ง ์์ผ๋ฉด ํจ์์ ์คํ ์์๋๋ก ํ๋ก๋ฏธ์ค์ ์ํ๊ฐ ๊ฒฐ์ ๋๋ค.
const promise = new Promise((resolve, reject) => {
resolve("Success");
reject("Fail");
});
// ๊ฒฐ๊ณผ : Promise {<fulfilled>: 'Success'}
console.log(promise);
const promise = new Promise((resolve, reject) => {
reject("Fail")
resolve("Success");
});
// ๊ฒฐ๊ณผ : Promise {<rejected>: 'Fail'}
console.log(promise);
ํ๋ก๋ฏธ์ค ๊ฐ์ฒด์ [[PromiseState]]์ [[PromiseResult]] ํ๋กํผํฐ๋ ๊ฐ๋ฐ์๊ฐ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ ๋ด๋ถ ํ๋กํผํฐ๋ก ํ๋ก๋ฏธ์ค์ ์ฒ๋ฆฌ ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ๊ฐ๋ฐ์๊ฐ [[PromiseResult]]์ ์ ๊ทผํ ์ ์๋ค.
๐ก ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ์ง๋ง ํ๋ก๋ฏธ์ค ๊ฐ์ฒด์ [[PromiseResult]]๋ง ํ์ธ์ด ๊ฐ๋ฅํ ์ํ๋ก ์ค๋ ์ด์ ๋ ๊ฐ๋ฐ์๊ฐ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ ๋ด๋ถ ํ๋กํผํฐ๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋ฐ๊ฟ์ฃผ๋ ํ์์ธ๊ฒ ๊ฐ๋ค.
๐ Promise.prototype.then("์ฑ๊ณต ์ฒ๋ฆฌ ์ฝ๋ฐฑ ํจ์", "์คํจ ์ฒ๋ฆฌ ์ฝ๋ฐฑ ํจ์")
const promise = new Promise((resolve, reject) => {
resolve("Success");
});
// ๊ฒฐ๊ณผ : Success
promise.then((res) => console.log(res), (err) => console.log(err));
const promise = new Promise((resolve, reject) => {
reject("Fail");
});
// ๊ฒฐ๊ณผ : Fail
promise.then((res) => console.log(res), (err) => console.log(err));
๐ Promise.prototype.catch("์คํจ ์ฒ๋ฆฌ ์ฝ๋ฐฑ ํจ์")
const promise = new Promise((resolve, reject) => {
reject("Fail");
});
// ๊ฒฐ๊ณผ : Fail
promise.catch((err) => console.log(err));
๐ Promise.prototype.finally("๋ฌด์กฐ๊ฑด ์คํํ๋ ์ฝ๋ฐฑ ํจ์")
const promise = new Promise((resolve, reject) => {
resolve("Success");
});
// ๊ฒฐ๊ณผ : ์ํ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ์คํ
promise.finally(() => console.log("์ํ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ์คํ"));
const promise = new Promise((resolve, reject) => {
reject("Fail");
});
// ๊ฒฐ๊ณผ : ์ํ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ์คํ
promise.finally(() => console.log("์ํ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ์คํ"));
๐ then ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ฑ๊ณต๊ณผ ์คํจ ๋๊ฐ์ ๊ฒฝ์ฐ ์ ๋ถ ํ ์ ์์ง๋ง ์๋ฉํฑ์ ์ผ๋ก ์ฑ๊ณต์ then
์คํจ๋ catch
๊ณตํต์ ์ผ๋ก ์ฒ๋ฆฌ ํ ๊ฒฝ์ฐ finally
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ฐ๋ ์ฑ์ ๋ฌธ์ ๊ฐ ์์ง๋ง ํ๋ก๋ฏธ์ค ์ฒด์ด๋์ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ ์ฑ ์๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
// โ
const promise = new Promise((resolve, reject) => {
resolve("Success");
});
promise
// โก
.then((res) => new Promise((resolve, reject) => resolve("์ฑ๊ณต")))
// โข
.then((res) => console.log(res))
// โฃ
.finally(() => console.log("์คํ ์๋ฃ"));
๐ ์ฝ๋ ๋์ ์๋ฆฌ
โ ํ๋ก๋ฏธ์ค ์์ฑ์ ํจ์๋ฅผ ์ด์ฉํด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
โก ํ๋ก๋ฏธ์ค ์ฒ๋ฆฌ ๋ฉ์๋์ธ then์ ์ฌ์ฉํด์ ํ๋ก๋ฏธ์ค๋ฅผ ์๋กญ๊ฒ ๋ฐํํ๋ค.
โข ํ๋ผ๋ฏธํฐ res์๋ ์ ํ๋ก๋ฏธ์ค ์ฒ๋ฆฌ ๋ฉ์๋์ ๊ฒฐ๊ณผ๊ฐ์ธ "์ฑ๊ณต"
์ด ์ ์ฅ๋์ด ์๋ค.
โฃ ๋ง์ง๋ง ๋์๊ณผ์ ์ธ finally ๋ฉ์๋๊ฐ ํธ์ถ๋์ด "์คํ ์๋ฃ"
๋ฅผ ๋ก๊ทธ์ ์ถ๋ ฅํ๋ค.
Promise์ ์ ์ ๋ฉ์๋๋ 5๊ฐ์ง๋ฅผ ์ ๊ณตํ๋ค.
๐ Promise.resolve
// fulfilled ์ํ์ ํ๋ก๋ฏธ์ค๋ฅผ ์์ฑํ๋ค.
const resolve = Promise.resolve("Success");
// ๊ฒฐ๊ณผ : Success
resolve.then((res) => console.log(res));
๐ Promise.reject
// rejected ์ํ์ ํ๋ก๋ฏธ์ค๋ฅผ ์์ฑํ๋ค.
const reject = Promise.reject("Fail");
// ๊ฒฐ๊ณผ : Fail
reject.catch((err) => console.log(err));
๐ Promise.all
const data = [];
// resolve๊ฐ 1์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("1"), Math.random() * 1000);
});
// resolve๊ฐ 2์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => resolve("2"), Math.random() * 1000);
});
// resolve๊ฐ 3์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => resolve("3"), Math.random() * 1000);
});
// 3๊ฐ์ resolve์ ๊ฐ์ data์ธ ๋ฐฐ์ด์ ๋ฃ๊ณ ํ์ธ (์คํ ์์ ๋ณด์ฅ X)
promise1.then((res) => {
data.push(res);
console.log(data);
});
promise2.then((res) => {
data.push(res);
console.log(data);
});
promise3.then((res) => {
data.push(res);
console.log(data);
});
์ ์ฝ๋์ ๋ฌธ์ ๋ ์คํ ์์๋ ๋ณด์ฅ๋์ง ์์ผ๋ฉฐ ์ด๋ค ํ๋ก๋ฏธ์ค๊ฐ ๋ง์ง๋ง์ ์คํ๋๋์ง ํ์ธ๋ ๋ถ๊ฐ๋ฅํ๋ค.
๐งฉ ํ๋ก๋ฏธ์ค ์ฒด์ด๋์ผ๋ก ์์ฐจ์ ์ฒ๋ฆฌ
const data = [];
// resolve๊ฐ 1์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("1"), Math.random() * 1000);
});
// resolve๊ฐ 2์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => resolve("2"), Math.random() * 1000);
});
// resolve๊ฐ 3์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => resolve("3"), Math.random() * 1000);
});
// return์ผ๋ก Promise๋ฅผ ๋๊ฒจ์ฃผ๋ฉด์ ์์๋ฅผ ๋ณด์ฅ๋ฐ๋๋ค.
promise1
.then((res) => {
data.push(res);
return promise2;
})
.then((res) => {
data.push(res);
return promise3;
})
.then((res) => {
data.push(res);
// ๊ฒฐ๊ณผ : [1, 2, 3]
console.log(data);
});
์์๋ฅผ ๋ณด์ฅ๋ฐ์ง๋ง ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ ๋๋์ ๋ฐ์ ์ ์๋ค.
๐งฉ Promise.all์ ์ฌ์ฉ๊ณผ ํน์ง
// resolve๊ฐ 1์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("1"), Math.random() * 1000);
});
// resolve๊ฐ 2์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => resolve("2"), Math.random() * 1000);
});
// resolve๊ฐ 3์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => resolve("3"), Math.random() * 1000);
});
// ์์๋ฅผ ๋ณด์ฅํ๋ฉฐ ๊ฐ๋
์ฑ๋ ํ๋ณดํ ์ ์๋ค.
Promise.all([promise1, promise2, promise3])
// ๊ฒฐ๊ณผ : [1, 2, 3]
.then((res) => console.log(res));
// resolve๊ฐ 1์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("1"), Math.random() * 1000);
});
// reject๊ฐ Error์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => reject("Error"), Math.random() * 1000);
});
// resolve๊ฐ 3์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => resolve("3"), Math.random() * 1000);
});
// ํ๊ฐ์ ํ๋ก๋ฏธ์ค๋ผ๋ rejected ์ํ๋ผ๋ฉด catch๋ก ํ์ธํ ์ ์์ผ๋ฉฐ ์คํ์ ์ข
๋ฃ๋๋ค.
Promise.all([promise1, promise2, promise3])
.then((res) => console.log(res))
// ๊ฒฐ๊ณผ : Error
.catch((err) => console.log(err));
๐งฉ Promise.all์ ์ค๋ฅ ํด๊ฒฐ ๋ฐฉ๋ฒ
// resolve๊ฐ 1์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("1"), Math.random() * 1000);
});
// reject๊ฐ Error์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => reject("Error"), Math.random() * 1000);
});
// resolve๊ฐ 3์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => resolve("3"), Math.random() * 1000);
});
// catch๋ฅผ ์ฌ์ฉํด์ rejected ์ํ๊ฐ ๋ฐ์ํ๋ฉด ๊ทธ ๊ฐ์ ๋ฐํํ์ฌ fulfilled ์ํ๋ก ๋ฐ๊ฟ์ ์ถ๋ ฅํ๋ ๋ฐฉ์
Promise.all([promise1, promise2.catch((err) => err), promise3])
// ๊ฒฐ๊ณผ : [ '1', 'Error', '3' ]
.then((res) => console.log(res))
// catch๊ฐ ์คํ๋์ง ์๋๋ค.
.catch((err) => console.log(err));
๐ Promise.allSettled
// resolve๊ฐ 1์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("1"), Math.random() * 1000);
});
// reject๊ฐ Error์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => reject("Error"), Math.random() * 1000);
});
// resolve๊ฐ 3์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => resolve("3"), Math.random() * 1000);
});
Promise.allSettled([promise1, promise2, promise3])
/*
๊ฒฐ๊ณผ :
[
{ status: 'fulfilled', value: '1' },
{ status: 'rejected', reason: 'Error' },
{ status: 'fulfilled', value: '3' }
]
*/
.then((res) => console.log(res));
๐ Promise.race
// resolve๊ฐ 1์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("1"), Math.random() * 1000);
});
// resolve๊ฐ 2์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => resolve("2"), Math.random() * 1000);
});
// resolve๊ฐ 3์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => resolve("3"), Math.random() * 1000);
});
// race ์์
Promise.race([promise1, promise2, promise3])
// ํจ์์ ์คํ์ด ์ ์ผ ๋นจ๋ฆฌ ์ข
๋ฃ๋ fulfilled ๊ฐ์ด ์ถ๋ ฅ
.then((res) => console.log(res));
// resolve๊ฐ 1์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("1"), Math.random() * 1000);
});
// resolve๊ฐ 2์ ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => resolve("2"), Math.random() * 1000);
});
// rejected๊ฐ Error ๊ฐ์ ๊ฐ์ง๋ ํ๋ก๋ฏธ์ค ์์ฑ
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => reject("Error"), Math.random() * 1000);
});
// race ์์
Promise.race([promise1, promise2, promise3])
// ํจ์์ ์คํ์ด ์ ์ผ ๋นจ๋ฆฌ ์ข
๋ฃ๋ fulfilled, rejected๊ฐ ์คํ
.then((res) => console.log("fulfilled", res))
.catch((err) => console.log("rejected", err));
๐ก Promise.race ํ๋กํผํฐ๋ ์์๊ฐ ๋ณด์ฅ๋๋ ๊ฒ๋ ์๋๊ณ ๋นจ๋ฆฌ ์คํ์ด ์๋ฃ๋ ํ๋ก๋ฏธ์ค ํ๋๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ๋ง์ด ํ์ง๋ ์์ ๊ฒ ๊ฐ๋ค.