📌 참고
자바스크립트 비동기 처리와 콜백 함수
자바스크립트 Promise 쉽게 이해하기
자바스크립트 async와 await
ex #1 jQuery ajax 통신
function getData() {
let data;
$.get('https://domain.com/products/1', function(response) {
data = response;
}); // 데이터를 요청하고 받아올 때까지 기다리는 것 ❌
return data; // 해당 줄을 바로 실행 ⭕
}
console.log(getData()); // 🚨 response 값이 아닌 undefined 값이 찍힘
ex #2 setTimout과 같이 JS Engine이 아닌 Web API 영역에 따로 정의되어 있는 함수
console.log("A");
setTimeout(function() {
console.log("3 seconds passed"); // 3초 및 해당 줄의 출력을 기다리는 것 ❌
}, 3000);
console.log("B"); // 해당 줄을 바로 실행 ⭕
// 🚨 A - (3초 후) 3 seconds passed - B 순서가 아닌, A - B - (3초 후) 3 seconds passed 순서로 출력!
비동기 처리를 원하지 않아요! 동기적으로 한 작업이 끝난 뒤 다른 작업을 실행시키고 싶어요! 할 때에는..?
👉 콜백함수를 통해 특정 로직이 끝났을 때 원하는 동작을 실행하도록 실행 순서를 보장할 수 있음
// ex #1 jQuery ajax 통신이 동기적으로 이루어질 수 있도록 개선한 코드
function getData(callback) {
$.get('https://domain.com/products/1', function(response) {
callback(response);
});
}
getData(function(data) {
console.log(data);
}
// 콜백지옥의 예시
$.get('url', function(response) {
parseValue(response, function(id) {
auth(id, function(result) {
display(result, function(text) {
console.log(text);
});
});
});
});
function parseValueDone(id) {
auth(id, authDone);
}
function authDone(result) {
display(result, displayDone);
}
function displayDone(text) {
console.log(text);
}
$.get('url', function(response) {
parseValue(response, parseValueDone);
});
new Promise();
메서드 호출 시 대기 상태new Promise(function(resolve, reject) { … });
와 같이 콜백 함수 선언 가능resolve
실행 시 이행 상태then()
을 사용하여 처리 결과 값을 받을 수 있음 reject
실행 시 실패 상태catch()
를 사용하여 실패 이유를 받을 수 있음function func() {
return new Promise(function(resolve, reject) {
$.get('url', function(response) {
if (response) resolve();
reject(new Error("Request is failed"));
});
});
}
func().then(function(data) { // ✅ Fulfilled
console.log(data); // response 값 출력
}).catch(function(error) { // 🚨 Rejected
console.log(error); // 실패 이유 출력
});
new Promise(function(resolve, reject){
setTimeout(function() {
resolve(1);
}, 2000);
})
.then(function(result) {
console.log(result); // 1
return result + 10;
})
.then(function(result) {
console.log(result); // 11
return result + 20;
})
.then(function(result) {
console.log(result); // 31
});
then()
의 두 번째 인자로 에러를 처리하는 방법 → then()
의 콜백 함수 내에서 발생한 오류를 제대로 잡아내지 못함getData().then(handleSuccess, handleError);
catch()
를 이용하는 방법 → 보다 효율적!getData().then().catch();
async
라는 예약어 붙이기await
붙이기await
가 의도한 대로 동작!async function 함수명() {
await 비동기_처리_메서드_명();
}
try-catch
문 활용