๐ ๋น๋๊ธฐ๋?
ํน์ ์ฝ๋์ ์ฐ์ฐ์ด ๋๋ ๋๊น์ง ์ฝ๋์ ์คํ์ ๋ฉ์ถ์ง ์๊ณ ๋ค์ ์ฝ๋๋ฅผ ๋จผ์ ์คํํ๋ ๊ฒ.
ex) ajax, setTimeout(), callback
๐๐ป ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ด์ ?
ํ๋ฉด์์ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ์๋ ์๋ฒ๊ฐ ์ธ์ ๊ทธ ์์ฒญ์ ๋ํ ์๋ต์ ์ค์ง ๋ชจ๋ฅด๋๋ฐ ๋ง๋ฅ ๊ธฐ๋ค๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ, JavaScript๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ํ์์ ์ด๋ค.
๐ await, async
promise์ ๋ฌธ์ ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๊ฐ์ฅ ์ต๊ทผ์ ๋์จ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฌธ๋ฒ.
- ๊ธฐ์กด์ callback์ด๋promise์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋ง๋ค์ด์ก๋ค.
ex) callback ์ง์ฅ, then() ์ง์ฅ - await์ async๋ ์ฃผ๋ก ๊ฐ์ด ์ฐ์ธ๋ค.
- ๊ธฐ์กด ๋๊ธฐ์ ์ฒ๋ฆฌ์ ๋จ์ ์ ๋ณด์ํ๊ณ ๊ฐ๋ ์ฑ์ ๋์ฌ์ค๋ค.
- ์์ธ ์ฒ๋ฆฌ๋ try-catch๋ก ํ๋ค.
๐๐ป ๋ด๊ฐ ์ฌ์ฉํ await, async
function ์์ async๋ง ๋ถ์ฌ์ฃผ๋ฉด ๋๊ณ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋๋ ๋ถ๋ถ ์์ await๋ง ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
// ๊ฒ์๊ธ ๋ฑ๋ก ํจ์
const handleBoardSubmit = async () => {
const result = await axios
.post(`${BASE_URL}/board`, {
title: submit.title,
contents: submit.contents,
})
.catch((err) => {
throw err;
});
};
await & async๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด promise๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๋ ์ฑ์ด ์ข๋ค.
๐ promise
Promise๋ ํ๋ก๋ฏธ์ค๊ฐ ์์ฑ๋ ๋ ๊ผญ ์ ์ ์์ง๋ ์์ ๊ฐ์ ์ํ ๋๋ฆฌ์๋ก, ๋น๋๊ธฐ ์ฐ์ฐ์ด ์ข ๋ฃ๋ ์ดํ์ ๊ฒฐ๊ณผ๊ฐ์ด๋ ์คํจ ์ด์ ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฐ๊ฒฐํ ์ ์๋๋ก ํ๋ค.
ํ๋ก๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ๋ฉ์๋์์ ๋ง์น ๋๊ธฐ ๋ฉ์๋์ฒ๋ผ ๊ฐ์ ๋ฐํํ ์ ์๋ค. ๋ค๋ง ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง๋ ์๊ณ , ๋์ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํด์ ๋ฏธ๋์ ์ด๋ค ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ค.
๐๐ป promise์ ์ํ ๊ฐ
promise๋ฅผ ์ฌ์ฉํ ๋ ์์์ผ ํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ด ๋ฐ๋ก promise์ ์ํ(state)์ด๋ค. ์ํ(state)๋ promise์ ์ฒ๋ฆฌ ๊ณผ์ ์ ์๋ฏธํ๋ค.
promise๋ ๋ค์ ์ค ํ๋์ ์ํ๋ฅผ ๊ฐ์ง๋ค.
1. pending(๋๊ธฐ)
์ดํํ๊ฑฐ๋ ๊ฑฐ๋ถ๋์ง ์์ ์ด๊ธฐ ์ํ.
์๋์ ๊ฐ์ด new Promise() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๋๊ธฐ(pending) ์ํ๊ฐ ๋๋ค.
new Promise();
new Promise() ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ callback ํจ์๋ฅผ ์ ์ธํ ์ ์๊ณ , callback ํจ์์ ์ธ์๋ resolve, reject์ด๋ค.
new Promise(function(resolve, reject) { // ... });
2. fulfilled(์ดํ)
์ฐ์ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋จ.
callback ํจ์์ ์ธ์ resolve๋ฅผ ์๋์ ๊ฐ์ด ์คํํ๋ฉด ์ดํ(fulfilled) ์ํ๊ฐ ๋๋ค.
new Promise(function(resolve, reject) { resolve(); });
๊ทธ๋ฆฌ๊ณ ์ดํ ์ํ๊ฐ ๋๋ฉด ์๋์ ๊ฐ์ด then()์ ์ด์ฉํ์ฌ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐ์ ์ ์๋ค.
function getData() {
return new Promise(function(resolve, reject) {
var data = 100;
resolve(data);
});
}
// resolve()์ ๊ฒฐ๊ณผ ๊ฐ data๋ฅผ resolvedData๋ก ๋ฐ์
getData().then(function(resolvedData) {
console.log(resolvedData); // 100
});
3. rejected(์คํจ)
์ฐ์ฐ์ด ์คํจํจ.
new Promise()๋ก ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด callback ํจ์ ์ธ์๋ก resolve์ reject๋ฅผ ์ฌ์ฉํ ์ ์๋๋ฐ, ์ฌ๊ธฐ์ reject๋ฅผ ์๋์ ๊ฐ์ด ํธ์ถํ๋ฉด ์คํจ(rejected) ์ํ๊ฐ ๋๋ค.
new Promise(function(resolve, reject) { reject(); });
๊ทธ๋ฆฌ๊ณ ์คํจ ์ํ๊ฐ ๋๋ฉด ์คํจํ ์ด์ (์คํจ ์ฒ๋ฆฌ์ ๊ฒฐ๊ณผ ๊ฐ)๋ฅผ catch()๋ก ๋ฐ์ ์ ์๋ค.
function getData() {
return new Promise(function(resolve, reject) {
reject(new Error("Request is failed"));
});
}
// reject()์ ๊ฒฐ๊ณผ ๊ฐ Error๋ฅผ err์ ๋ฐ์
getData().then().catch(function(err) {
console.log(err); // Error: Request is failed
});
๋๊ธฐ ์ค์ธ ํ๋ก๋ฏธ์ค๋ ๊ฐ๊ณผ ํจ๊ป ์ดํํ ์๋, ์ด๋ค ์ด์ (์ค๋ฅ)๋ก ์ธํด ๊ฑฐ๋ถ๋ ์ ์๋ค.
์ดํ์ด๋ ๊ฑฐ๋ถ๋ ๋, ํ๋ก๋ฏธ์ค์ ์ฐ๊ฒฐํ ์ฒ๋ฆฌ๊ธฐ๋ ๊ทธ ํ๋ก๋ฏธ์ค์ then ๋ฉ์๋์ ์ํด ๋๊ธฐ์ด์ ์ค๋ฅธ๋ค.
์ด๋ฏธ ์ดํํ๊ฑฐ๋ ๊ฑฐ๋ถ๋ ํ๋ก๋ฏธ์ค์ ์ฐ๊ฒฐํ ์ฒ๋ฆฌ๊ธฐ๋ ํธ์ถํ๋ค.
์ฐธ๊ณ ์ฌ์ดํธ
๐๐ป MDN - Promise
๐๐ป ์๋ฐ์คํฌ๋ฆฝํธ Promise ์ฝ๊ฒ ์ดํดํ๊ธฐ
๐๐ป JavaScript Async/Await (๋น๋๊ธฐ ํจ์์ ์คํ ์์)
'Front-End' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Self Refactoring Tip (0) | 2021.11.17 |
---|---|
RESTful API ๋? (0) | 2021.11.15 |
gitignore (0) | 2021.11.10 |
Axios ๋? (0) | 2021.11.10 |
SSR, CSR, SPA (0) | 2021.11.05 |
๋๊ธ