💡 비동기 처리를 위한 첫 출발점인 콜백에 대해서 정확하게 이해하고 넘어가자!(콜백을 어떤 경우, 어떤 상황에서 사용하면 안되는지!)
: 정해진 순서에 맞게 코드가 실행되는 것!
console.log('1'); // 1
console.log('2'); // 2
console.log('3'); // 3
: 비동기적으로, 언제 코드가 실행될지 예측할 수 없는 것을 뜻한다.
setTimeout(() => console.log('2'), 1000); // 1초 뒤에 2를 출력해줘~
setTimeout()
: 브라우저에서 제공하는 api로, 지정한 시간이 지나면 우리가 전달한 함수 즉, 콜백함수를 호출하는 것이다.function printImmediately(print) {
print();
}
printImmediately(() => console.log('hello'));
printImmediately
라는 함수를 만들어서 뭔지는 모르지만 print
하는 callback을 받아서 그 callback을 바로 실행하는 함수를 만들어보았다.printImmediately
는 print
라는 콜백함수를 바로 전달받는다.(JS는 타입이 아니라서 print
가 어떤 타입의 콜백함수를 받는지는 예측 할 수가 없다.)function printWithDelay(print, timeout) {
setTimeout(print, timeout);
}
printWithDelay(() => console.log('async callback'), 2000);
🤓 JS는 함수를 저런 위와 같이 콜백 형태로 인자로 다른 함수에 전달할 수도 있고, 또는 변수에 할당할 수도 있는 그런 언어이다. 언어들마다 콜백을 지원하는 방식은 저마다 차이점이 존재한다.
promise
와 async await
를 이용해서 콜백 지옥을 이쁘게 바꿀 수 있으니 걱정하지말자~!// Callback Hell example
class UserStorage {
loginUser(id, password, onSuccess, onError) {
setTimeout(() => {
if (
(id === 'ellie' && password === 'dream') ||
(id === 'coder' && password === 'academy')
) {
onSuccess(id);
} else {
onError(new Error('not found'));
}
}, 2000);
}
getRoles(user, onSuccess, onError) {
setTimeout(() => {
if (user === 'ellie') {
onSuccess({ name: 'ellie', role: 'admin' });
} else {
onError(new Error('no access'));
}
}, 1000);
}
}
const userStorage = new UserStorage();
const id = prompt('enter your id');
const password = prompt('enter your passrod');
userStorage.loginUser(
id,
password,
user => {
userStorage.getRoles(
user,
userWithRole => {
alert(
`Hello ${userWithRole.name}, you have a ${userWithRole.role} role`
);
},
error => {
console.log(error);
}
);
},
error => {
console.log(error);
}
);
➕ 추가로 공부할 것
1. js의 콜백함수에서 큐랑 스택에 대해서 찾아보기!
2. 콜백지옥 해결방법에 대해 고민해보기