FRONT-END/TIL
[TIL] 230126 동기, 비동기, 콜백
서근
2023. 1. 26. 17:18
반응형
동기 / 비동기
자바스크립트는 동기적인 아이 이다.
호이스팅이 된 이후부터 코드가 작성한 순서부터 동기적으로 실행 된다.
호이스팅 : var
변수와 function
선언들이 자동적으로 제일 위로 올리가는것.
- 동기
synchronous
: 정해진 순서에 맞게 코드가 실행되는것 - 비동기
asynchronous
: 언제 코드가 실행될지 예측할 수 없는것.
동기 비동기의 차이를 알아보기위해 코드를 써보면 이러하다.
console.log('1');
// 비동기 (브라우저 API)
setTimeout(() => {
console.log('2');
}, 1000); // 이것이 콜백 함수
console.log('3');
/*===Synchronous callback*/
function printImmdeiately(print) {
print();
}
printImmdeiately(() => console.log('hello'));
/*===Asynchronous callback*/
function printWithDelay(print, timeout) {
setTimeout(print, timeout);
}
printWithDelay(() => console.log('async callback'), 2000);
위 코드 안에는 동기와 비동기가 존재하는데 일단 호이스팅에 인해, var
와 함수는 최 상단에서 선언 된다.
/*===Synchronous callback*/
function printImmdeiately(print) {
print();
}
/*===Asynchronous callback*/
function printWithDelay(print, timeout) {
setTimeout(print, timeout);
}
console.log('1');
setTimeout(() => {
console.log('2');
}, 1000);
console.log('3');
printImmdeiately(() => console.log('hello'));
printWithDelay(() => console.log('async callback'), 2000);
실행 순서는 다음과 같다.
console.log('1'); // 동기
setTimeout(() => {console.log('2');}, 1000); //비동기
console.log('3'); //동기
printImmdeiately(() => console.log('hello')); //동기
printWithDelay(() => console.log('async callback'), 2000); //비동기
Callback
이름 그대로 되돌아와서 호출해라는 의미이다.
const add = (a, b) => a + b;
const multiply = (a, b) => a * b;
const divide = (a, b) => a / b;
function calculator(a, b, action) {
let result = action(a, b);
console.log(result);
return result;
}
action
은 외부로 부터 주어지는 함수 즉 콜백 함수라고 한다.
즉, a와 b는 num으로 가져오 되, action
부분에는 변수 함수로 정해준 이름을 넣어주면 된다.
이것이 콜백함수의 형태이다. (호출하지않고, 주소만 받아옴)
calculator(3, 2, multiply); //6
calculator(1, 3, add); //4
calculator(10, 2, divide); //5
전달된 action
은 콜백함수라 함.
전달될 당시에 함수를 바로 호출해서 반환된 값을 전달하는것이 아닌 함수를 가리키고 있는 함수의 래퍼런스(참조값)가 전달된다.
그렇기에 함수는 고차함수 안에서 필요한 순간에 호출이 나중에 된다.
function calculate2(a, b, action) {
if (a < 0 || b < 0) {
console.log('ERROR: 인자 값이 0보다 작음');
return; // return undefined
}
let result = action(a, b);
console.log(result);
}
// 함수의 래퍼런스를 받아서 필요한 순간에 호출하기 때문에 조건에 맞지 않는다면 영원히 호출되지 않는다.
calculate2(3, 2, multiply);
calculate2(-1, 0, add);
위 예시 이미지를 보면, 삭제 버튼을 눌렀을 때 바로 삭제가 되지 않는데, ajax
요청을 받기도 전에 어드민 유무 검증을 하기 때문에 그냥 return
시켜버리기 때문이다.
그래서 아래의 경우는 500ms 정도 걸린다고 가정하였을 때 500ms 이후에 어드민 유무 검증을 하기 때문에, 아래 코드는 사용할 수 있는 코드가 된다.
참고 문헌 REFERENCE
드림코딩 자바스크립트