먼저 등장하는 walk(500), walk(300), walk(200) 호출에서는 각각 주어진 시간 동안 걷기를 시도했다는 메시지가 콘솔에 표시되지만, 네 번째 walk(700) 호출에서는 amount가 주어진 함수의 조건문에 걸어둔 500을 초과하기 때문에 "the value is too big"이라는 오류 메시지를 출력합니다. 비동기 처리 도중 오류가 발생했으므로 walk(400)은 호출되지 않아 이후 콘솔에는 아무런 메시지도 뜨지 않습니다.
// 코드 - async/await 오류 발생 예시
function walk(amount) {
return new Promise((resolve, reject) => {
if (amount > 500) {
reject("the value is too big"); // amount가 500보다 큰 경우, 오류 메시지를 전달하여 reject
}
setTimeout(() => {
resolve(`you walked for ${amount}ms`); // 주어진 시간만큼 대기 후, 성공적으로 resolve
}, amount);
});
}
async function go() {
// 비동기 작업 1
const res = await walk(500); // walk 함수를 호출하여 500ms 동안 걷기를 시도
console.log(res); // 결과 출력
// 비동기 작업 2
const res2 = await walk(300); // walk 함수를 호출하여 300ms 동안 걷기를 시도
console.log(res2); // 결과 출력
// 비동기 작업 3
const res3 = await walk(200); // walk 함수를 호출하여 200ms 동안 걷기를 시도
console.log(res3); // 결과 출력
// 비동기 작업 4
const res4 = await walk(700); // walk 함수를 호출하여 700ms 동안 걷기를 시도
console.log(res4); // 오류 발생: "the value is too big"
// 비동기 작업 5 --> 이 부분은 실행되지 않음
const res5 = await walk(400);
console.log(res5);
console.log("finished");
}
go(); // go 함수 실행
async/await을 try…catch 문과 함께 사용하면 코드의 가독성이 향상됩니다. 만약 myAsyncFunction()에서 오류가 발생하면 catch 문에 작성된 에러 메시지가 실행되고, 오류가 발생한 이후의 코드는 실행되지 않습니다. 이처럼 async/await을 사용하면 비동기 코드를 동기식 코드처럼 작성할 수 있지만, 예외 처리에 주의해야 합니다. 모든 async 함수는 프로미스 객체를 반환합니다.
async function myAsyncFunction() {
try {
// 비동기 작업 1
const result1 = await someAsyncOperation1();
// 비동기 작업 2
const result2 = await someAsyncOperation2();
// 이후의 코드는 오류가 발생하지 않았을 때만 실행됨
console.log('All async operations completed successfully');
} catch (error) {
// 오류가 발생하면 이 블록이 실행됨
console.error('An error occurred:', error.message);
}
}