동기식 처리
예외
대표적으로 사용되는 곳은 서버쪽과 데이터를 주고 받을 때 사용하는데, 클라이언트쪽에서 서버쪽에 비동기 요청을 하고 클라이언트에서는 다른 작업을 수행하고 있다가 서버쪽에서 모든 작이 완료되면 resoponse를 해주면, 그 순간 전달받은 데이터를 클라이언트에서 사용하는 방식
console.log(1);
setTimeout(function(){
console.log(2);
}, 1000);
console.log(3);
먼저 수행할 수 있는 1,3 출력 후 1초뒤 2 출력
function add5(a, callback) {
setTimeout(() => callback(a + 5), 100)
// 100ms가 지난 후 함수로 입력받은 callback에 a + 10값을 다시 입력하여 callback함수 호출
}
add5(10, function (res) { // add5가 입력받는 callback함수 정의 부분
console.log(res)
});
add5 호출하는 부분 첫번째 인자는 5, 함수 생성 후 전달
add5함수 내부에서는 입력받은 함수 callback에 a + 5 후 다시 호출
callback은 사용하기 편리하지만 연속적으로 사용하게 되면 유지보수가 힘들어진다는 단점이 있다.
add5(10, res => {
add5(res, res => {
add5(res, res => {
add5(res, res => {
console.log(res)
})
})
})
})
이런식으로 몇번 연속 호출하게 되면 그것이 바로 지옥....
기본적으로는 callback함수와 하는 일이 같다.
Promise는 작업이 끝난 후 실행할 함수를 제공하는 것이 아니라 Promise자체 메소드인then()
을 호출한다.
function add10(a) {
return new Promise(resolve => setTimeout(() => resolve(a + 10), 100));
}//Promise사용 시 작업이 끝났음을 알려주는 resolve를 인자로 받아들임.
add10(10)
.then(add10)
.then(add10)
.then(add10)
.then((res) => console.log(res))
console.log(add10(10));
sPromise { <pending> }
promise는 then()과 같은 다른 메소드를 연속적으로 사용이 가능하다는 이점을 가지고 있다. callback함수를 사용했을 때와는 다르게 코드를 작성하고 이해하기 쉬워짐.
add10()
가 결과값을 promise로 리턴한다.
callback 함수와 비교해서 code 가 옆으로 길어지지가 않는다
let first = new Promise(function (resolve, reject) { // resolve 는 성공, reject 는 실패 한것을 나타냄
resolve(); // resolve 가 실행이 되면 밑에 .then 이 실행이 됨
reject(); // reject 가 실행이 되면 밑에 .catch 가 실행됨
});
first.then(() => {
// first 가 성공일 경우 실행 할 코드
}).then(() => {
// 그다음에 실행할 것
}).catch(() => {
// catch 는 위의 코드가 실패 했을 경우 실행 하는 code
})
비동기적 처리가 가능하게 바꿔주는 문법!
callback대신 사용할 수 있으며 보기 쉽게 만들어줌