๋น๋๊ธฐ๋?
ํ์ฌ ์คํ์ค์ธ ์์ ๊ณผ๋ ๋ณ๋๋ก ๋ค๋ฅธ ์์ ์ ์ํํ๋ ๊ฒ
Callback์ด๋?
๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋๋ฉด ํธ์ถ๋๋ ํจ์
๋น๋๊ธฐ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ํจ์ ๊ฐ์ฒด๋ฅผ ๋๊ธฐ๋ ๊ธฐ๋ฒ
Promise๋?
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ ์์ (setTimeout, API ์์ฒญ)์ ๋ค๋ฃจ๊ธฐ ์ํ ๊ฐ์ฒด
- pending(๋๊ธฐ์ค(์์ ์ค))
- fulfilled(์ฑ๊ณต)
- rejected(์คํจ)
const p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("์ฑ๊ณต!");
}, 1000);
}).then(value => {
console.log(value);
}).catch(err => {
console.error(err);
}).finally(() => {
console.log("๋ฌด์กฐ๊ฑด ์คํ๋จ");
});
Async/await๋?
- Promise๋ฅผ ๋์ฒดํ๋ ๊ธฐ๋ฅ์ ์๋๋ค.
- function ์์ async ๋ถ์ฌ์ฃผ๊ณ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋๋ ๋ถ๋ถ ์์ awit๋ง ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
- ์ฝ๋ ์์ฑ ๋ถ๋ถ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ ์ง๋ณด์ํ๊ฒ ํธํ๊ฒ ๋ณด์ด๋ ๋ฌธ๋ฒ๋ง ๋ค๋ฅด๊ฒ ํด์ค ๋ฟ
- async
- ํจ์ ์์ async ํค์๋๋ฅผ ๋ถ์ฌ์ค์ผ๋ก์จ, ํจ์๋ด์์ await๋ฅผ ์ฌ์ฉ
- ES2022๋ถํฐ ๋ชจ๋ ์ค์ฝํ(ESM)์์๋ ํ์ผ ์ต์๋จ์์๋ await์ ์ธ ์ ์๊ฒ ํ์ฉ
- ํจ์ ๋ฆฌํด๊ฐ์ Promse ๊ฐ์ฒด ⇒ ๋จ์ํ ๊ฐ์ด์ฌ๋ fulfilled ์ํ์ ๊ฐ์ฒด ๋ฐํ
- await
- Promise ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ๋ ๊น์ง ์ฝ๋ ์คํ์ ์ผ์ ์ค์งํ๊ณ wait
์ฝ๋ฐฑ ์ง์ฅ(Callback Hell) ํด๊ฒฐ ๋ฐฉ๋ฒ
์ฝ๋ฐฑ ํจ์๊ฐ ์ค์ฒฉ๋์ด ์ฝ๋์ ๊น์ด๊ฐ ๊น์ด์ง๋ ํ์
- ์ฝ๋ฐฑ ์ง์ฅ์ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฝ๋ฐฑ ์์ ๋ ์ฝ๋ฐฑ์ ๊ณ์ ์ค์ฒฉํด ์์ฑํ๋ฉด์
์ฝ๋ ๊ตฌ์กฐ๊ฐ ๊น์ด์ง๊ณ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ ๋ฌธ์ ์ด๋ค.
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํฌ๊ฒ ์ธ ๊ฐ์ง ์ ๊ทผ์ ์ฌ์ฉํ๋ค.
- Promise
๋น๋๊ธฐ ์์ ์ ์ฑ๊ณต/์คํจ๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ๊ด๋ฆฌํ ์ ์์ด then() ์ฒด์ด๋์ ํตํด ์์ฐจ์ ์ผ๋ก ์์ฑ ๊ฐ๋ฅ
- async/await
Promise๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง ๋๊ธฐ ์ฝ๋์ฒ๋ผ ๊ฐ๋ฅ
- Promise.all
๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์์ ์ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ ์ ์์ด ๊ตฌ์กฐ ๊ฐ์
Promise์ Callback์ ์ฐจ์ด
1. ๊ฒฐ๊ณผ๊ฐ ์ฌ์ฉ ๋ฒ์
callback์ ์ฌ์ฉํ๋ฉด ์ฝ๋ฐฑ ๋ฐ์์๋ ๊ฒฐ๊ณผ๊ฐ์ ์ ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ callback์์์๋ง ์ฒ๋ฆฌํด์ผ ํ๋ค.
promise๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฐ๊ณผ๊ฐ์ด promise ๊ฐ์ฒด์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ callback ๋ฐ์์๋ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
Callback
function async(callback) {
var result;
setTimeout(() => {
result = callback("๊ฒฐ๊ณผ๊ฐ"); // 1์ด ๋ค ์คํ
},1000);
return result; // โ setTimeout๋ณด๋ค ๋จผ์ ์คํ๋จ
}
var b = async((res) => {
return res;
})
console.log(b) // undefined
Promise ๊ฐ์ฒด์ ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ธ์ ๋ then ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
var p = new Promise((res, rej) => {
setTimeout(() => {
res("a")
}, 1000)
})
var result = p.then(res => {
return res;
})
console.log(result) // Promise {<fulfilled>: "a"}
result.then(res => {
console.log(res); // "a"
})
2. ์ฝ๋ ๊น์ด ์ฐจ์ด
๋น๋๊ธฐ ๋ก์ง์ ๊ฒฐ๊ณผ(1)๋ฅผ ๋ฐ์์ ๋ค์ ๋น๋๊ธฐ ๋ก์ง์ ์คํํ ๋ callback์ ์ ์ ๊น์ด์ ธ์ ๊ฐ๋ ์ฑ์ด ๋์ฐ
Promise๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฝ๋๊ฐ ๊น์ด์ง์ง ์๋๋ค.
Callback
function async(result, callback) {
setTimeout(() => {
callback(result, function (result) {
console.log(result);
});
}, 1000);
}
async(0, function (res, callback) {
callback(res)
async(res + 1, function (res, callback) {
callback(res)
async(res + 1, function (res, callback) {
callback(res)
});
});
});
// 0
// 1
// 2
Promise ๊ฐ์ฒด์ ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ธ์ ๋ then ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
function async(result) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(result);
resolve(result);
}, 1000)
});
}
async(0).then(res => {
return async(res + 1);
}).then(res => {
return async(res + 1);
})
// 0
// 1
// 2
Promise์ Async/await ์ฐจ์ด
1. ์ฝ๋ ๊น์ด ์ฐจ์ด
Promise์ ์ฌ์ฉํ๋ฉด then์ ์ฐ์์ ์ผ๋ก ์ฌ์ฉํ์ฌ ์ฝ๋๊ฐ ๋ณต์ก
async/await์ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์ ๊ทผ ๋ฐฉ์์ ๋๊ธฐ์ ์ผ๋ก ์์ฑํ ์ ์๋ค.
2. ์๋ฌ ์ฒ๋ฆฌ
Promise์ ์ฌ์ฉํ๋ฉด catch() ํธ๋ค๋ฌ๋ฅผ ์ค๊ฐ ์ค๊ฐ์ ๋ช ์ํจ์ผ๋ก์จ ์๋ฌ๋ฅผ ๋ฐ์์ผ๋ง ํ๋ค.
async/await์ ์ฌ์ฉํ๋ฉด try/catch๋ฌธ์ ์์ฐ๋ฉด ๋๋ค.
๋ณ๋ ฌ ์ฒ๋ฆฌ
๊ณตํต
function getApple(){
return new Promise( (resolve, reject) => {
setTimeout(() => resolve("apple"), 1000);
})
}
function getBanana(){
return new Promise( (resolve, reject) => {
setTimeout(() => resolve("banana"), 1000);
})
}
์๋ชป๋ ์์
async function getFruites() {
let a = await getApple(); // getApple() ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๊ณ , ์์ฒญ์ด ์ฒ๋ฆฌ๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆผ (1์ด ์์)
let b = await getBanana(); // getBanana() ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๊ณ , ์์ฒญ์ด ์ฒ๋ฆฌ๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆผ (1์ด ์์)
console.log(`${a} and ${b}`); // ์ด 2์ด ์์
}
์ฌ๋ฐ๋ฅธ ์์
async function getFruites(){
let getApplePromise = getApple(); // asyncํจ์๋ฅผ ๋ฏธ๋ฆฌ ๋
ผ๋ธ๋กํน์ผ๋ก ์คํํ๋ค.
let getBananaPromise = getBanana(); // asyncํจ์๋ฅผ ๋ฏธ๋ฆฌ ๋
ผ๋ธ๋กํน์ผ๋ก ์คํํ๋ค.
// ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ๊ฐ ๋ฐฑ๋จ์์ ๋
๋ฆฝ์ ์ผ๋ก ๊ฑฐ์ ๋์์ ์คํ๋๊ฒ ๋๋ค.
console.log(getApplePromise)
console.log(getBananaPromise)
let a = await getApplePromise; // ์์์ ๋ฐ์ ํ๋ก๋ฏธ์ค๊ฐ์ฒด ๊ฒฐ๊ณผ ๋ณ์๋ฅผ await์ ํตํด ๊บผ๋ธ๋ค.
let b = await getBananaPromise; // ์์์ ๋ฐ์ ํ๋ก๋ฏธ์ค๊ฐ์ฒด ๊ฒฐ๊ณผ ๋ณ์๋ฅผ await์ ํตํด ๊บผ๋ธ๋ค.
console.log(`${a} and ${b}`); // ๋ณธ๋๋ผ๋ฉด 1์ด+1์ด ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋๋ฐ, ์์์ 1์ด๊ธฐ๋ค๋ฆฌ๋ ํจ์๋ฅผ ๋ฐ๋ก ์ฐ์์ผ๋ก ๋น๋๊ธฐ๋ก ๋ถ๋ ค์๊ธฐ ๋๋ฌธ์, ๋์ถฉ 1.01์ด๋ง ๊ธฐ๋ค๋ฆฌ๋ฉด ์ฒ๋ฆฌ๋๋ค.
})'โ๏ธFront-End > ๐JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [JS] ์ฟ ํค/ ์ธ์ / JWT / Access Token, Refresh Token ์ธ์ฆ ๋ฐฉ์ (0) | 2026.01.06 |
|---|---|
| [JS] OffscreenCanvas (0) | 2024.12.26 |
| [JS] ResizeObserver (0) | 2024.12.09 |
| [JS] Web Worker (0) | 2024.11.18 |
| [JS] var, let, const (0) | 2024.02.22 |