๐ async / await ์ ๋ฆฌ
async / await๋ ๋น๋๊ธฐ ์์
์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ ์ต์ JavaScript ๋ฌธ๋ฒ์
๋๋ค.
์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋๊ธฐ ๋ฐฉ์์ฒ๋ผ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ณ , ์ฝ๋ฐฑ ์ง์ฅ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๐
๐ async ํค์๋
- async ํค์๋๊ฐ ๋ถ์ ํจ์๋ ํญ์ Promise๋ฅผ ๋ฐํํฉ๋๋ค.
- ๋ฐํ๊ฐ์ด Promise๊ฐ ์๋ ๊ฒฝ์ฐ, ์๋์ผ๋ก Promise.resolve(๋ฐํ๊ฐ)์ผ๋ก ๊ฐ์ธ์ ๋ฐํ๋ฉ๋๋ค.
โ ์์ : async ํจ์๋ Promise๋ฅผ ๋ฐํํ๋ค
async function get1() {
return '1'; // ์๋์ผ๋ก Promise.resolve('1')๋ก ๋ณํ๋จ
}
// ์คํ
const one = get1();
one.then((num) => console.log(num)); // ์ถ๋ ฅ: 1
โ get1()์ Promise๋ฅผ ๋ฐํํ๋ ํจ์๋ก ๋ณํ๋ฉ๋๋ค.
โ .then()์ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋ฐ์์ฌ ์ ์์ต๋๋ค.
๐ await ํค์๋
- await ํค์๋๋ ๋น๋๊ธฐ ํจ์(async ํจ์) ๋ด๋ถ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- await์ ์ฌ์ฉํ๋ฉด ํด๋น Promise๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ๋ค์ ์ฝ๋๊ฐ ์คํ๋ฉ๋๋ค.
โ ์์ : await์ผ๋ก ๋น๋๊ธฐ ์์ ์ ์์ฐจ ์คํ
function network() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('๐ก ๋ฐ์ดํฐ ์์ฒญ ์ค...');
resolve('โ
๋ฐ์ดํฐ ๋ฐ์์ด');
}, 2000);
});
}
async function getData() {
console.log('๐ ๋คํธ์ํฌ ์์ฒญ ์์');
// network() ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆผ
const result1 = await network();
console.log(result1); // โ
๋ฐ์ดํฐ ๋ฐ์์ด
const result2 = await network();
console.log(result2); // โ
๋ฐ์ดํฐ ๋ฐ์์ด
console.log('๐ ๋ชจ๋ ๋คํธ์ํฌ ์์ฒญ ์๋ฃ!');
}
getData();
โ await network();๊ฐ ์คํ๋ ๋ 2์ด ๋์ ๊ธฐ๋ค๋ฆฐ ํ ๋ค์ ์ฝ๋ ์คํ
โ await์ ์ฌ์ฉํ๋ฉด ์ฝ๋ฐฑ ์์ด๋ ๋น๋๊ธฐ ์ฝ๋์ ํ๋ฆ์ ์์ฐจ์ ์ผ๋ก ํํ ๊ฐ๋ฅ
๐ async / await ์๋ฌ ์ฒ๋ฆฌ
๋น๋๊ธฐ ์์ ์์ ์์ธ(error)๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ, try/catch ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์์ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
โ ์์ : try / catch๋ก ์๋ฌ ์ฒ๋ฆฌ
function networkWithError() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('โ ๋คํธ์ํฌ ์ค๋ฅ ๋ฐ์'));
}, 2000);
});
}
async function fetchData() {
try {
console.log('๐ ๋คํธ์ํฌ ์์ฒญ ์์');
const data = await networkWithError(); // ์คํจ ์ catch ๋ธ๋ก์ผ๋ก ์ด๋
console.log(`โ
๋ฐ์ดํฐ: ${data}`);
} catch (err) {
console.error(err.message); // โ ๋คํธ์ํฌ ์ค๋ฅ ๋ฐ์
} finally {
console.log('๐ฏ ์์
์๋ฃ (์ฑ๊ณต/์คํจ ๊ด๊ณ์์ด ์คํ)');
}
}
fetchData();
โ try ๋ธ๋ก์์ await์ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ์์ฒญ ์คํ
โ reject๊ฐ ๋ฐ์ํ๋ฉด ์ฆ์ catch ๋ธ๋ก์ผ๋ก ์ด๋ํ์ฌ ์๋ฌ ์ฒ๋ฆฌ
โ **finally**๋ ์ฑ๊ณต/์คํจ ์ฌ๋ถ์ ์๊ด์์ด ๋ง์ง๋ง์ ํญ์ ์คํ๋จ
๐ await์ ์ค์์ฑ
- await์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋น๋๊ธฐ ์ฝ๋๊ฐ ์์๋๋ก ์คํ๋์ง ์๊ณ ๋จผ์ ์คํ๋ ์๋ ์์
- await์ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋ ํ ๋ค์ ์ฝ๋๊ฐ ์คํ๋จ
โ await ์์ด ์คํํ ๊ฒฝ์ฐ
async function getDataWithoutAwait() {
console.log('๐ ๋คํธ์ํฌ ์์ฒญ ์์');
const result = network(); // `await` ์์ (๋น๋๊ธฐ ์คํ)
console.log(result); // Promise ๊ฐ์ฒด๊ฐ ์ถ๋ ฅ๋จ
console.log('๐ ๋คํธ์ํฌ ์์ฒญ ์๋ฃ! (๋ฐ์ดํฐ๊ฐ ์ค๊ธฐ ์ ์ ์คํ)');
}
getDataWithoutAwait();
๐น ์ถ๋ ฅ ๊ฒฐ๊ณผ:
โ await์ด ์์ด์ ๋คํธ์ํฌ ์์ฒญ์ด ์๋ฃ๋๊ธฐ ์ ์ ๋ค์ ์ฝ๋๊ฐ ์คํ๋จ
๐ async / await vs Promise.then()
| ๋น๊ตํญ๋ชฉ | async / await | Promise.then() |
| ๊ฐ๋ ์ฑ | ๋๊ธฐ ์ฝ๋์ฒ๋ผ ์ฝ๊ธฐ ์ฌ์ โ | ์ฝ๋ฐฑ์ด ๋ง์์ง๋ฉด ๋ณต์กํด์ง โ |
| ์๋ฌ ์ฒ๋ฆฌ | try / catch๋ก ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌ โ | .catch()๋ฅผ ๋ฐ๋ก ์ถ๊ฐํด์ผ ํจ โ |
| ์ฒด์ด๋ | ์ง๊ด์ โ | .then().then() ๋ฐฉ์์ผ๋ก ์ด์ด์ง โ |
| ๋ณ๋ ฌ ์คํ | Promise.all() ํ์ โ | ์๋ ๋ณ๋ ฌ ์คํ ๊ฐ๋ฅ โ |
โ Promise.then() ๋ฐฉ์
network()
.then((data) => {
console.log(data);
return network();
})
.then((data) => {
console.log(data);
})
.catch((err) => console.error(err));
โ async / await ๋ฐฉ์
async function fetchData() {
try {
const data1 = await network();
console.log(data1);
const data2 = await network();
console.log(data2);
} catch (err) {
console.error(err);
}
}
fetchData();
โ async / await์ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋๊ธฐ ๋ฐฉ์์ฒ๋ผ ์์ฐ์ค๋ฝ๊ฒ ์ฝํ
โ Promise.then()๋ณด๋ค ์๋ฌ ์ฒ๋ฆฌ๊ฐ ์ง๊ด์
๐ Promise.all()์ ํ์ฉํ ๋ณ๋ ฌ ์คํ
๐ await์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ๋ฉด ์์
์ด ์์ฐจ์ ์ผ๋ก ์คํ๋๋ฏ๋ก ์๋๊ฐ ๋๋ ค์ง ์ ์์
๐ ์ฌ๋ฌ ๋น๋๊ธฐ ์์
์ ๋์์ ์คํํ๋ ค๋ฉด Promise.all()์ ์ฌ์ฉํด์ผ ํจ
โ ์์ฐจ ์คํ (๋นํจ์จ์ )
async function fetchSequential() {
const data1 = await network();
console.log(data1);
const data2 = await network();
console.log(data2);
}
fetchSequential();
โ network()๊ฐ ๋๋ ํ ๋ค์ ์์ ์ด ์์๋จ (์ด 4์ด ์์)
โ ๋ณ๋ ฌ ์คํ (ํจ์จ์ )
async function fetchParallel() {
const [data1, data2] = await Promise.all([network(), network()]);
console.log(data1, data2);
}
fetchParallel();
โ Promise.all()์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์์ ์ด ๋์์ ์คํ๋์ด ๋ ๋น ๋ฅด๊ฒ ์๋ฃ๋จ ๐
๐ ์ ๋ฆฌ
- async → ํจ์๊ฐ Promise๋ฅผ ๋ฐํํ๋๋ก ๋ณํ
- await → Promise๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์ฝ๋ ์คํ
- try / catch → async / await์์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
- finally → ์ฑ๊ณต/์คํจ์ ๊ด๊ณ์์ด ๋ง์ง๋ง์ ์คํ
- Promise.all() → ์ฌ๋ฌ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ๋ณ๋ ฌ ์คํํ์ฌ ์๋ ํฅ์
๐ข async / await์ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๋๊ธฐ ์ฝ๋์ฒ๋ผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค! ๐
// promise๋ฅผ ๊ฐ์ธ์ ๋ณด๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ค๋ค.
// Async: ๋น๋๊ธฐ ํจ์๋ฅผ ์ ์ํ๋ ํค์๋
// async -> promise๋ฅผ ๋ฐํํ๋ ๋น๋๊ธฐ ํจ์๋ก ๋ณํ
async function get1() {
return '1';
}
// async ํค์๋๊ฐ ๋ถ์ผ๋ฉด ํญ์ promise๋ก ๋ฆฌํด
const one = get1();
one.then((num) => console.log(num));
// async ํจ์ ์์์ promise๋ฅผ ๋ฆฌํดํ๋ฉด promise๋ก ๊ฐ์ธ์ง ์๋๋ค.
function network() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('data');
resolve('data resolve');
}, 2000);
});
}
async function getData() {
// await์ async ํจ์ ๋ด๋ถ์์๋ง ์คํ์ด ๊ฐ๋ฅํ๋ค.
// await์ด ์๋ค๋ฉด ๋น๋๊ธฐ์ ์ผ๋ก console.log('dataReturn') ๊ฐ์ด ๋จผ์ ํ์๋๋ค.
// ์์ฐจ์ ์ผ๋ก ์คํํ ์ ์๋ค.
await network();
await network();
// async ๋ด๋ถ์์ ์๋ฌ์ฒ๋ฆฌ
try {
const net = await network();
} catch (err) {
console.log(err);
// ์๋ฌ ์ ๋์ ๋ฃ์ ๊ฐ์ ๋ฆฌํด
net = 'data reject';
}
return console.log(`return ${net}`);
}
'JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [JavaScript] ๊ตฌ์กฐ ๋ถํด ํ ๋น (4) | 2024.12.22 |
|---|---|
| [JavaScript] Reduce (5) | 2024.12.22 |
| [JavaScript] ์ฝ๋ฐฑํจ์ (3) | 2024.12.20 |
| [JavaScript] Fetch, AJAX, Axios (2) | 2024.12.20 |
| [JavaScript] Promise (0) | 2024.12.20 |