안녕하세요. 오늘은 자바스크립트 Async/Await에 대해 알아보도록 하겠습니다. (유튜브 '코드팩토리'님의 강의 일부를 참고하였습니다.)
Async/Await란?
자바스크립트에서 비동기 코드를 동기 코드처럼 작성할 수 있게 해주는 문법이며, 'async'와 'await' 키워드는 프로미스(Promise)와 함께 사용되며 비동기 작업의 결과를 기다린 후 코드를 계속 실행할 수 있게 해줌
async
- async 키워드가 붙은 함수는 항상 프로미스를 반환함
- 함수 내에서 await를 사용하여 비동기 작업이 완료될 때까지 기다릴 수 있음
await
- async 함수 내에서만 사용할 수 있으며 프로미스가 이행(fulfilled)되거나 거부(rejected)될 때까지 기다림
- await는 프로미스의 이행 결과를 반환하거나, 거부된 경우 에러를 던짐
- promise를 반환하는 것에만 사용할 수 있음
Async/Await 사용 방법
async 함수 정의
async function myAsyncFunction() {
return "Hello, 뭉이!";
}
myAsyncFunction().then(result => console.log(result)); // Hello, 뭉이!
위 코드에서 'myAsyncFunction'은 'async' 키워드를 사용하여 정의된 함수이며, 이 함수는 기본적으로 프로미스를 반환하고 반환 값은 자동으로 'resolve'됨
await 키워드 사용
'await' 키워드를 사용하면 비동기 작업이 완료될 때까지 코드의 실행을 일시적으로 중지할 수 있음
이로 인해 코드가 동기적으로 작성된 것처럼 보이게 됨
function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('2초 후 완료');
}, 2000);
});
}
async function asyncCall() {
console.log('호출 시작');
const result = await resolveAfter2Seconds();
console.log(result); // '2초 후 완료' 출력
console.log('호출 끝');
}
asyncCall();
// 호출 시작
// 2초 후에 '2초 후 완료' 출력
// 호출 끝
위 코드에서 'await resolveAfter2Seconds()'는 프로미스가 이행될 때까지 기다림. 그럼 그 동안 다른 코드의 실행은 중지되며 프로미스가 이행되면 'result'에 그 결과를 할당하고 코드 실행이 계속됨
예시)
const getPromise = (seconds) => new Promise((resolve, reject) => {
setTimeout(() => {
resolve('완료');
}, seconds * 1000);
});
async function runner() {
const result1 = await getPromise(1);
console.log(result1); // 1초 후 '완료' 출력
const result2 = await getPromise(2);
console.log(result2); // 추가로 2초 후 '완료' 출력
const result3 = await getPromise(1);
console.log(result3); // 추가로 1초 후 '완료' 출력
}
// 총 4초 후에 '완료' 메시지가 순차적으로 출력
에러 처리
async/await에서도 'try/catch'를 사용하여 에러를 처리할 수 있음
또한, 'finally'를 사용해 모든 작업이 완료된 후 실행할 코드를 작성할 수 있음
const getPromise2 = (seconds) => new Promise((resolve, reject) => {
setTimeout(() => {
reject('에러 발생!');
}, seconds * 1000);
});
async function runner2() {
try {
const result1 = await getPromise2(1);
console.log(result1);
const result2 = await getPromise2(2);
console.log(result2);
const result3 = await getPromise2(1);
console.log(result3);
} catch (e) {
console.log('--- catch e ---');
console.log(e); // 에러 발생 시 메시지 출력
} finally {
console.log('--- finally ---');
}
}
runner2();
// 1초 후에 '--- catch e ---' '에러 발생!' '--- finally ---' 순으로 출력
이 코드에서는 'getPromise2' 함수가 1초 후에 에러를 발생시키며 try/catch 블록에서 이를 처리함
에러가 발생하면 'catch' 블록이 실행되고, 마지막으로 'finally'이 실행됨
'Languages > JavaScript' 카테고리의 다른 글
[JS] for ...in, for ...of의 차이점 정리 (1) | 2024.09.09 |
---|---|
[JS] 호이스팅(Hoisting) (0) | 2024.09.09 |
[JS] 비동기 프로그래밍(2) : 프로미스(Promise) (0) | 2024.08.23 |
[JS] 비동기 프로그래밍(1) : 콜백 함수(Callback Function) (0) | 2024.08.23 |
[JS] 배열 메소드(Array Method) 총정리 (0) | 2024.08.22 |