[동기와 비동기]
자바스크립트는 동기적인 언어이다.
호이스팅이 된 이후부터 작성된 코드 순서대로 동기적으로 실행된다는 것이다.
호이스팅이란?
var 변수와 function declaration이 자동적으로 맨 위에 올라가는 것
async는 비동기적으로 언제 코드가 실행될지 모르는 것
대표적으로 settimeout이 있다. (브라우저에서 제공되는 api)
지정된 시간이 지나면 콜백 함수를 실행한다.
[callback이란?]
콜백이란 다른 함수가 실행을 끝낸 뒤 실행되는 함수를 말한다.
자바스크립트에서 함수는 object인데, 이 때문에 함수는 다른 함수의 인자로 쓰일 수도 있고
어떤 함수에 의해 리턴될 수도 있다.
이때 인자로 넘겨지는 함수를 콜백 함수라고 한다.
[동기와 비동기에서 callback]
나중에 내 함수를 불러줘~~ 하는 게 콜백이다.
비동기일 때만 쓰일까?
노노~
동기적으로 하는 synchronous callback
자바스크립트의 선언 호이스팅된다.
순서대로 실행함
//Synchronous callback
function printImmediately(print){
print() ;// 콜백함수인 print를 바로 실행
}
printImmediately(()=> console.log('hello'))
여기서 print라는 콜백 함수인데 동기적으로 했을 때는 바로 실행한다.
비동기 콜백
//Asynchronous callback
function printWithDelay(print, timeout){
setTimeout(print, timeout);
}
printWithDelay(()=> console.log('async callback'), 2000)
비동기적으로 print콜백 함수를 실행한다.
[콜백 지옥]
이런 콜백들로만 코드를 작성해서 계속 엮으면?? 콜백 지옥이 발생!!!
이런 콜백들로만 코드를 작성해서
이렇게 콜백을 계속 엮으면?
콜백 지옥이 발생
//Callback Hell example
class UserStorage{
loginUser(id, password, onSuccess, onError){
setTimeout(() => {
if(
(id === 'ellie' && password === 'dream')||
(id === 'coder' && password === 'academy')
){
onSuccess(id) //onSuccess라는 콜백을 전달해준다.
}
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);
}
}
//사용자에게 id와 페스워드를 받아온다.
//성공이라면 역할을 받아온다.
//성공하면 출력한다.
const userStorage = new UserStorage();
const id = prompt('enter your id');
const password = promt('enter your password');
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)
})
이 부분이 바로 콜백 지옥인데
문제점이 무엇이냐?
- 비즈니스 로직을 한눈에 알아보기 힘들다.
- 가독성이 떨어진다.
- 에러가 발생하고 디버깅을 해아 할 때 굉장히 어려워진다.
- 유지보수가 어려워진다.
이런 문제점은 바로 Promise로 해결할 수 있다!!
다음 게시물에서... 계속됨
728x90
'WEB > Java Script' 카테고리의 다른 글
[Java Script]비동기의 핵심 async await에 대해 알아보자! (0) | 2021.09.29 |
---|---|
[Java Script] Promise / 비동기처리에 대해 알아보자 (0) | 2021.09.29 |
[Java Script] 자바스크립트의 역사와 현재 그리고 미래 (0) | 2021.09.22 |
[ajax] ajax 기본 골격/ 미세먼지 api를 이용하여 구 별 미세먼지 수치 출력해보기/70이상은 빨간색으로 바꾸기 (2) | 2021.06.10 |
[Java Script] spread 함수 인자로 사용 / 배열의 원소를 모두 함수 인자로 넣고 싶을 때 (0) | 2021.04.24 |