일반적으로 JavaScript에서 비동기 작업을 수행할 때 콜백 함수를 사용, 콜백 함수들이 여러 개 중첩되어 사용될 경우 문제가 발생할 수 있음.
예를 들어, 하나의 비동기 작업이 끝나면 그 결과에 따라 다음 비동기 작업을 수행해야 하고, 그 작업이 끝나면 또 다른 작업을 수행해야 하는 식으로 계속 중첩되면서 코드의 가독성과 유지보수성이 떨어지며, 심지어는 버그의 원인이 될 수 있음.
.catch() 메서드를 사용하여 에러를 처리// 커피를 주문하는 프로미스 객체를 생성합니다. 생성자에는 약속을 지키기 위한 resolve와, 약속을 지키지 못했을 때를 대비한 reject 두 가지를 인자로 전달합니다. // 프로미스 객체를 생성하는 순간 프로미스 생성자함수의 콜백 함수가 실행됩니다. 이를 실행자(executor)라 부릅니다. const orderCoffee = new Promise((resolve, reject) => {const requestObj = new XMLHttpRequest();
requestObj.open('GET', 'orderCoffee.txt');
requestObj.onreadystatechange = () => {
if (requestObj.readyState === 4) {
if (requestObj.status === 200) {
const result = requestObj.responseText;
// resolve 메소드가 실행되면 then 메소드가 자동으로 호출됩니다.
resolve(result);
} else {
// resolve 메소드 호출이 없는 상태에서 reject 메소드가 실행되면 catch 메소드가 자동으로 호출됩니다.
reject(new Error(</span><span class="token string">커피주문이 정상적으로 이뤄지지 않았습니다.: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>requestObj<span class="token punctuation">.</span>status<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">));
}
}
};
requestObj.send();});
// 이 부분에 주목해주세요. then 메소드를 사용하면 비동기 코드를 마치 동기적인 코드처럼 작성할 수 있습니다. 앞에서 작성한 XHR 코드와 비교해보는것도 좋습니다.
// resolve 메소드가 실행될때 전달된 인자는 then 메소드의 콜백함수의 인자로 전달됩니다.
orderCoffee.then((asyncResult) => {
console.log(asyncResult);
console.log('약속이 이루어졌습니다.');
return asyncResult;
}).catch((error) => { // then 메소드는 프라미스 객체를 반환하기 때문에 catch 메소드를 이어서 쓰는것이 가능합니다.
// resolve 메소드와 마찬가지로 reject 메소드가 실행될때 전달된 인자는 catch 메소드의 콜백함수의 인자로 전달됩니다.
console.log(error);
})
fetch('https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json')
.then((response) => {
// response.ok 는 응답이 성공적(200-299)일 경우 true, 아니면 false를 반환합니다.
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
return response.json();
})
.then((data) => {
console.log(data);
return data;
})
// fetch 함수는 네트워크 오류가 발생하면 reject 상태의 프로미스를 반환합니다.
.catch((error) => {
console.error(error);
});
// fetch() 함수를 사용하여 주어진 URL에서 데이터를 가져오고, response.json()을 통해 JSON 형식으로 변환된 데이터를 사용.
//성공적으로 데이터를 가져온 경우 .then() 메서드를 이용하여 데이터를 처리
//네트워크 에러 등의 문제가 발생하면 .catch() 메서드를 통해 에러를 처리
async 키워드를 붙이면 해당 함수는 항상 Promise를 반환. 비동기 처리가 포함된 함수를 동기식처럼 작성할 수 있음.await 키워드는 Promise가 처리될 때까지 기다린 후, 그 결과를 반환. await는 async 함수 안에서만 사용할 수 있음.