동기식 처리 모델 Synchronous processing model
비동기식 처리 모델 Asynchronous processing model
단 콜백헬이 발생하는 단점이 있다
예를 들어
<!DOCTYPE html>
<html>
<body>
<script>
// 비동기 함수
function get(url) {
// XMLHttpRequest 객체 생성
const xhr = new XMLHttpRequest();
// 서버 응답 시 호출될 이벤트 핸들러
xhr.onreadystatechange = function () {
// 서버 응답 완료가 아니면 무시
if (xhr.readyState !== XMLHttpRequest.DONE) return;
if (xhr.status === 200) { // 정상 응답
console.log(xhr.response);
// 비동기 함수의 결과에 대한 처리는 반환할 수 없다.
return xhr.response; // ①
} else { // 비정상 응답
console.log('Error: ' + xhr.status);
}
};
// 비동기 방식으로 Request 오픈
xhr.open('GET', url);
// Request 전송
xhr.send();
}
// 비동기 함수 내의 readystatechange 이벤트 핸들러에서 처리 결과를 반환(①)하면 순서가 보장되지 않는다.
const res = get('http://jsonplaceholder.typicode.com/posts/1');
console.log(res); // ② undefined
</script>
</body>
</html>
new Promise()
Promise 생성자 함수를 통해 인스턴스화 한다.resolve,reject함수
를 콜백함수를 인자로 받는다// Promise 객체의 생성
const promise = new Promise((resolve, reject) => {
// 비동기 작업을 수행한다.
if (/* 비동기 작업 수행 성공 */) {
resolve('result');
}
else { /* 비동기 작업 수행 실패 */
reject('failure reason');
}
});
resolve
호출 --> fulfilled
상태reject
호출 --> rejected
상태상태 | 의미 | 구현 |
---|---|---|
pending | 비동기 처리가 아직 수행되지 않은 상태 | resolve 또는 reject함수가 아직 호출되지 않은 상태 |
fulfilled | 비동기 처리가 수행된 상태(성공) | resolve함수가 호출된 상태 |
rejected | 비동기 처리가 수행된 상태(실패) | reject함수가 호출된 상태 |
settled | 비동기 처리가 수행된 상태(성공 또는 실패) | resolve 또는 reject함수가 호출된 상태 |
함수1().함수2().함수3()...
then()
: 두 개의 콜백함수를 인자로 전달받는다.catch()
: 예외 발생시 호출then()
의 두번째 콜백함수에서 전달하지 않는 것이 좋다.catch()
를 사용하여 가독성을 높이는 것이 좋다. get()
.then((json) => {
//resolve가 호출됨에 따라 실행
console.log(json);
})
.catch((e)=> {
//reject가 호출됨에 따라 실행
console.log(e);
});
Promise.all([new Promise(),new Promise(),new Promise()...)
Promise.all()
의 반환하는 프로미스는 첫번째 프로미스가 resolve한 처리 결과부터 차례대로 배열에 담아 배열을 resolve하는 새로운 프로미스를 반환한다function getBanana() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('🍌');
}, 1000);
});
}
function getApple() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('🍎');
}, 3000);
});
}
function getOrange() {
return Promise.reject(new Error('no orange'));
}
//static함수를 이용하여 좀 더 간편하게 사용가능
// Promise.all 병렬적으로 한번에 모든 Promise들을 실행!
Promise.all([getBanana(), getApple()]) //
.then((fruits) => console.log('all', fruits));
// Promise.race 주어진 Promise중에 제일 빨리 수행된것이 이김!
Promise.race([getBanana(), getApple()]) //
.then((fruit) => console.log('race', fruit));