JavaScript

동기와 비동기

갈잃자 2023. 5. 8. 12:57

 

동기란

hoisting이 이루어진 뒤 함수나 동작이 차례대로 되는것

  • hoisting이란?  var 나 함수선언 등 특정 무언갈 선언하는걸 뜻함

비동기란

언제 코드가 실행될지 예측할 수 없는것

ex) setTimeout() 이란 web API

  • 지정한 시간이 지나면 우리가 전달한 함수, callback 함수를 호출

callback 함수란?

전달한 함수를 나중에 처리된 뒤 혹은, 특정 시간 뒤 응답받는 개념

ex)

console.log(1)

setTimeout(function() {
	console.log(2)
	},1000);

console.log(3)


// 결과값
1
3
2

//동작원리
js는 동기로 동작하므로 위에서 차례대로 실행

1. 1 출력
2. webAPI 요청보냄 (setTimeout)
3. 응답을 기다리지 않고 다음줄인 3 출력
4. 브라우저에서 1초가 지난 뒤, callback함수 실행하란 응답이 오고, 2출력

그렇다면 callback은 비동기에서만 실행되나?

정답은 no. 동기 callback과 비동기 callback으로 나뉜다

 

- 동기callback

호출 순서에 맞춰서 동작함

ex)

console.log(1)

function print(p) {
	p()	
}

print(() => console.log('hello'));
console.log(3)

// 결과
1
hello
3

//동작원리
1. 1출력
2. 함수를 선언(print())
3. print()를 callback 함
4. hello 출력
5. 3출력

 

- 비동기  callback

요청 후, 응답을 기다리지 않고, 응답이 오는 순서에 따라 출력함

 

ex)

function printWithDelay(print, timeOut) {
	setTimeout(print, timeOut)
}

function print(p) {
	p()
}

printWithDelay(() => console.log('async'), 2000);
console.log(1);
console.log(3);
print(() => console.log(2));

//결과
1
3
2
async

// 동작원리
1. printWithDelay 와 print 함수 선언
2. printWithDelay 실행 및 webAPI(setTimeout) 요청
3. 1 출력
4. 3 출력
5. print 함수 실행 및 2 출력
6. callback 함수 응답받고 'async' 출력