동기식 처리 모델 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));