💡 비동기 처리를 위한 첫 출발점인 콜백에 대해서 정확하게 이해하고 넘어가자!(콜백을 어떤 경우, 어떤 상황에서 사용하면 안되는지!)

: 정해진 순서에 맞게 코드가 실행되는 것!
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. 콜백지옥 해결방법에 대해 고민해보기