Promise๋ฅผ ํ์ฉํ๋ฉด ๋น๋๊ธฐ๋ก ์๋ํ๋ ์ฝ๋๋ฅผ ์ ์ดํ ์ ์๋ค.
(Callback Hell์ ๋ฐฉ์งํ๋ ์ญํ ๋ ์ํํ๋ค.)
Promise๋ class์ด๊ธฐ ๋๋ฌธ์ new ํค์๋๋ฅผ ํตํด Promise ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
๋ํ Promise๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ๋๋ฐ,
์ด ์ฝ๋ฐฑ ํจ์(executor)๋ resolve, reject ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ๋๋ค.
let promise = new Promise((resolve, reject) => {
// 1. ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ ๊ฒฝ์ฐ
// resolve์ ์ธ์์ ๊ฐ์ ์ ๋ฌํ ์๋ ์์ต๋๋ค.
resolve(value);
// 2. ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ
// reject์ ์ธ์์ ์๋ฌ๋ฉ์ธ์ง๋ฅผ ์ ๋ฌํ ์๋ ์์ต๋๋ค.
reject(error);
});
resolve
: ์ฐ์ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋จ ๐ .then
reject
: ์ฐ์ฐ์ด ์คํจํจ ๐ .catch
์ ์ ์ฒ๋ฆฌ ์ฌ๋ถ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ์คํ ๐.finally
let promise = new Promise(function(resolve, reject) {
resolve("์ฑ๊ณต");
});
promise
.then(value => {
console.log(value);
// "์ฑ๊ณต"
})
.catch(error => {
console.log(error);
})
.finally(() => {
console.log("์ฑ๊ณต์ด๋ ์คํจ๋ ์๋!");
// "์ฑ๊ณต์ด๋ ์คํจ๋ ์๋!"
})
๊ฐ๋จํ ์์
const character = (name) => {
return new Promise((resolve, reject) => {
if (name === "tata") {
resolve("tata ์บ๋ฆญํฐ์
๋๋ค."); // ์ฑ๊ณต
} else {
reject("tata ์บ๋ฆญํฐ๊ฐ ์๋๋๋ค."); // ์คํจ
}
});
};
character("tata")
.then((value) => {
console.log(value);
// tata ์บ๋ฆญํฐ์
๋๋ค.
})
.catch((error) => {
console.log(error);
})
.finally(() => {
console.log("๊ฐ์ฌํฉ๋๋ค.");
// ๊ฐ์ฌํฉ๋๋ค.
});
Promise chaining๊ฐ ํ์ํ๋ ๊ฒฝ์ฐ๋ ๋น๋๊ธฐ ์์ ์ ์์ฐจ์ ์ผ๋ก ์งํํด์ผ ํ๋ ๊ฒฝ์ฐ์ด๋ค.
Promise chaining์ด ๊ฐ๋ฅํ ์ด์ ?
.then
.catch
.finally
์ ๋ฉ์๋๋ค์ Promise๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ
.then ์์์ ๋ฆฌํดํ ๊ฐ์ด Promise๋ฉด Promise์ ๋ด๋ถ ํ๋กํผํฐ result๋ฅผ ๋ค์ .then ์ ์ฝ๋ฐฑ ํจ์์ ์ธ์๋ก ๋ฐ์์ค๊ณ , Promise๊ฐ ์๋๋ผ๋ฉด ๋ฆฌํดํ ๊ฐ์ .then ์ ์ฝ๋ฐฑ ํจ์์ ์ธ์๋ก ๋ฐ์์ฌ ์ ์๋ค.
let promise = new Promise(function(resolve, reject) {
resolve('์ฑ๊ณต');
// reject("์คํจ");
});
promise
.then((value) => {
console.log(value);
return '์ฑ๊ณต';
})
.then((value) => {
console.log(value);
return '์ฑ๊ณต';
})
.then((value) => {
console.log(value);
return '์ฑ๊ณต';
})
.catch((error) => {
console.log(error);
return '์คํจ';
})
.finally(() => {
console.log('์ฑ๊ณต์ด๋ ์คํจ๋ ์๋!');
});
// ์ฑ๊ณต
// ์ฑ๊ณต
// ์ฑ๊ณต
// ์ฑ๊ณต์ด๋ ์คํจ๋ ์๋!
โฑ setTimeout์ ์ฌ์ฉํ ์์
const printString = (string) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
console.log(string);
}, Math.floor(Math.random() * 100) + 1);
});
};
const printAll = () => {
printString('A')
.then(() => {
return printString('B');
})
.then(() => {
return printString('C');
});
};
printAll();
// A
// B
// C
Promise.all()์ ์ฌ๋ฌ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ๋์์ ์ฒ๋ฆฌํ๊ณ ์ถ์๋ ์ฌ์ฉํ๋ค.
์ธ์๋ก๋ ๋ฐฐ์ด์ ๋ฐ๊ณ , ํด๋น ๋ฐฐ์ด์ ์๋ ๋ชจ๋ Promise์์
executor ๋ด ์์ฑํ๋ ์ฝ๋๋ค์ด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๋์๋ค๋ฉด,
๊ฒฐ๊ณผ๋ฅผ ์๋ก์ด ๋ฐฐ์ด์ ์ ์ฅํ์ฌ ์๋ก์ด Promise๋ฅผ ๋ฐํํด ์ค๋ค.
Promise.all()์ ์ฌ์ฉํ์ง ์์์ ๋
const promiseOne = () => new Promise((resolve, reject) => setTimeout(() => resolve('1์ด'), 1000));
const promiseTwo = () => new Promise((resolve, reject) => setTimeout(() => resolve('2์ด'), 2000));
const promiseThree = () => new Promise((resolve, reject) => setTimeout(() => resolve('3์ด'), 3000));
// ๊ธฐ์กด
const result = [];
promiseOne()
.then(value => {
result.push(value);
return promiseTwo();
})
.then(value => {
result.push(value);
return promiseThree();
})
.then(value => {
result.push(value);
console.log(result);
// ['1์ด', '2์ด', '3์ด']
})
// ์ด 6์ด๊ฐ ๊ฑธ๋ ธ๋ค.
Promise.all()์ ์ฌ์ฉํ์ ๋
// promise.all
Promise.all([promiseOne(), promiseTwo(), promiseThree()])
.then((value) => console.log(value))
// ['1์ด', '2์ด', '3์ด']
.catch((err) => console.log(err));
// ์ด 3์ด๊ฐ ๊ฑธ๋ ธ๋ค.
Promise.all์ ์ธ์๋ก ๋ฐ๋ ๋ฐฐ์ด์ ์๋ Promise ์ค
ํ๋๋ผ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ฉด ๋๋จธ์ง Promise์ state์ ์๊ด์์ด ์ฆ์ ์ข
๋ฃ๋๋ค.
Promise.all([
new Promise((resolve, reject) => setTimeout(() => reject(new Error('์๋ฌ1'))), 1000),
new Promise((resolve, reject) => setTimeout(() => reject(new Error('์๋ฌ2'))), 2000),
new Promise((resolve, reject) => setTimeout(() => reject(new Error('์๋ฌ3'))), 3000),
])
.then((value) => console.log(value))
.catch((err) => console.log(err));
// Error: ์๋ฌ1
์ด๋ ๊ฒ Promise๋ฅผ ํตํด ๋น๋๊ธฐ ์ฝ๋์ ์์๋ฅผ ์ ์ดํ ์ ์์ง๋ง,
Callback ํจ์์ ๊ฐ์ด ์ฝ๋๊ฐ ๊ธธ์ด์ง์๋ก ๋ณต์กํด์ง๊ณ
๊ฐ๋
์ฑ์ด ๋ฎ์์ง๋ Promise Hell์ด ๋ฐ์ํ๋ค๋ ๋จ์ ์ด ์๋ค.
์ด ๋จ์ ์ ํด๊ฒฐํ๊ณ ์ถ๋ค๋ฉด Async / Await๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
JavaScript๋ ES8์์ async / awaitํค์๋๋ฅผ ์ ๊ณตํ์๋ค.
์ด๋ฅผ ํตํด ๋ณต์กํ Promise ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๋ค.
๐ค ์ฌ์ฉ๋ฒ?
ํจ์ ์์ async ํค์๋๋ฅผ ์ฌ์ฉํ๊ณ ,
async ํจ์ ๋ด์์๋ง await ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
// ํจ์ ์ ์ธ์
async function funcDeclarations() {
await ์์ฑํ๊ณ ์ ํ๋ ์ฝ๋
...
}
// ํจ์ ํํ์
const funcExpression = async function () {
await ์์ฑํ๊ณ ์ ํ๋ ์ฝ๋
...
}
// ํ์ดํ ํจ์
const ArrowFunc = async () => {
await ์์ฑํ๊ณ ์ ํ๋ ์ฝ๋
...
}
โฑ setTimeout์ ์ฌ์ฉํ ์์
const printString = (string) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
console.log(string);
}, Math.floor(Math.random() * 100) + 1);
});
};
const printAll = async () => {
await printString('A');
await printString('B');
await printString('C');
};
printAll();
// A
// B
// C
๐ ์ง๊ธ ๋ฐ๋ก ๋๊ธฐ์ ๋น๋๊ธฐ, ํ์ด๋จธ ๊ด๋ จ API(setTimeout...) ๋ณด๋ฌ๊ฐ๊ธฐ
๐ callback, Promise, Async Await ์ฐจ์ด์ ํ๋์ ๋ณด๊ณ ์ถ๋ค๋ฉด?