자바스크립트 비동기 처리 Callback
어떠한 함수들이 시간이 걸리는 연산(또는 작업)일 때 그냥 순서대로 호출하는 식의 코드를 작성하게 되면, 원하는 순서대로 처리가 되지 않는것을 경험할 수 있다.
😅 실행할 때마다 실행 순서가 달라요!
아래 코드는 각 함수들의 실행 시간을 Math.random() 함수를 이용하여 랜덤하게 실행되도록 했다. func1(), func2(), func3() 순서대로 호출했지만 실행할 때마다 호출되는 순서가 다른것을 볼 수 있다.
* Math.random() : 0~1 사이의 소수 값을 반환해주는 함수
function func1() {
setTimeout(()=>{
console.log('1');
}, Math.random()*100);
}
function func2() {
setTimeout(()=>{
console.log('2');
}, Math.random()*100);
}
function func3() {
setTimeout(()=>{
console.log('3');
}, Math.random()*100);
}
func1();
func2();
func3();
😊 실행 순서가 항상 같아야 할 경우 - Callback을 사용하자
각 함수마다 next라는 Callback 함수 인자를 받을 수 있게 하였고, 각 함수가 그다음 함수를 호출하게 하였다.
아무리 시간이 걸린다고 해도, 앞의 함수가 다음(next) 함수를 불러주기 때문에 실행 순서가 원하는 대로 호출되는 것을 볼 수 있다.
* Callback 함수: 함수의 매개변수 인자 값을 함수로 줬을 때의 함수
function func1(next) {
setTimeout(()=>{
console.log('1');
if(next) {
next();
}
}, Math.random()*100);
}
function func2(next) {
setTimeout(()=>{
console.log('2');
if(next) {
next();
}
}, Math.random()*100);
}
function func3(next) {
setTimeout(()=>{
console.log('3');
if(next) {
next();
}
}, Math.random()*100);
}
func1(()=>{
func2(()=>{
func3();
});
});
😱 콜백 지옥
실행 순서에 맞게 호출해야 하는 함수가 많이 지게 되면 아래와 같이 콜백 지옥을 경험할 수 있다.
다음 포스팅에서는 콜백 지옥을 막기 위한 다른 비동기 처리 방법 Promise와 aync/await에 대해 알아보자.
func(()=>{
funcNext(()=>{
funcNext(()=>{
funcNext(()=>{
funcNext(()=>{
funcNext(()=>{
funcNext(()=>{
funcNext(()=>{
});
});
});
});
});
});
});
});
[Javascript] 비동기 처리 3 - async/await
🤓Promise를 async/await으로 변경 '비동기 처리 1 - Callback'(https://jaegeun.tistory.com/22)의 방법을 Promise 방법으로 바꾸는 방법은 '비동기 처리 2 - Promise'(https://jaegeun.tistory.com/23) 이고,..
jaegeun.tistory.com
[Javascript] 비동기 처리 2 - Promise
🤓Callback 함수를 Promise로 변경 '비동기 처리 1 - Callback'(https://jaegeun.tistory.com/22)의 방법을 Promise 방법으로 바꾸는 코드는 다음과 같다. function func1() { return new Promise((resolve, reje..
jaegeun.tistory.com
[Javascript] 배열 연산 동기화(Promise All)
자바스크립트는 모든 코드가 절차 지향적으로 동기화되어 실행되지 않는다. 시간이 걸리는 작업은 바로 실행되지 않고 콜백 큐에 넣어두고 다음 코드로 넘어가게 된다. 그래서 아래와 같이 배
jaegeun.tistory.com