따라서 동기는 정해진 순서에 맞게 코드가 실행되는 것이고 비동기적인 것은 언제 코드가 실행될지 예측할 수 없는 것을 말한다.
setTimeout()함수의 경우 지정한 시간이 지나면 전달한 콜백 함수를 호출하는 함수인데
콜백 함수라는 건 전달해준 함수를 나중에 다시 불러줄 수 있는 개념의 함수로 두번째 인자에 시간을 넣어주면 그 시간이 자난 뒤에 콜백함수가 실행되어 비동기적인 시행이 이뤄진다.
-동기적 콜백함수
function printImmediately(print){
print();
}
printImmediately(()=>console.log('sync'))
-비동기적 콜백함수
function printWithDelay(print, timeout) {
setTimeout(print, timeout);
}
printWithDelay(()=>console.log('async callback'),2000)
// Callback Hell example
class UserStorage{
// 사용자의 데이터를 서버에게서 데이터를 받아오는 클래스
loginUser(id, psw, onSuc, onErr){
// 사용자로부터 id,psw받아 로그인하고 로그인 이뤄지면 onSuc 콜백함수를, 실패시 onErr 콜백함수를 호출
setTimeout(()=>{
if (
(id === 'ellie' && psw === 'dream') ||
(id === 'coder' && psw === 'academy')
) {
onSuc(id);
// 아이디 비밀번호가 위 조건에 맞으면 전달한 onSuc 콜백함수에 id전달
} else {
onErr(new Error('not found'));
// 만약 여기에 포함되지 않는 경우라면 onErr콜백을 불러주면서
// Error라는 오브젝트 만들어'not found' 전달
}
},2000);
}
getRoles(user, onSuc, onErr){
//사용자의 데이터를 받아서 사용자 마다 가지고 admin, guest처럼 역할을 서버에게 다시 용청해서 정보를 받아오는 api
setTimeout(()=>{
if (user === 'ellie') {
onSuc({ name: 'ellie', role: 'admin' });
} else {
onErr(new Error('no access'));
// Error라는 오브젝트를 만들어서 'no access' 전달해 줄 거에요
}
},1000);
}
}
const userStorage = new UserStorage();
const id = prompt('ent your id');
const psw = prompt('ent your psw');
userStorage.loginUser(
id,
psw,
user => {
userStorage.getRoles(
user,
userWithRole=>{
alert(`welcome ${userWithRole.name}, you have a ${userWithRole.role} role`)
},
err => {
}
);
},
error => {console.log(err)}
);