동기
실행된 코드의 결과가 나올때까지 대기하는 것
비동기
실행된 순서와 관계 없이 결과가 나오는 것
Blocking Model & Non-Blocking Model
Bloking Model
코드의 실행이 끝나기 전까지 실행 제어권을 다른곳에 넘기지 않아 다른 작업을 하지 못하고 대기하는 것
Non-blocking Model
코드의 실행이 끝나지 않아도 실행 제어권을 다른곳에 넘겨 다음 코드가 실행 될 수 있는 것 (자바스크립트는 논블로킹 모델)
그렇다면 동기, 비동기와는 뭐가 다른가?
제어권을 넘기면(Non-bloking) 다른 코드도 실행될 수 있으므로 비동기 처리가 가능하지만, 제어권을 넘기지 않으면 (Bloking) 비동기 처리가 가능한 환경이여도 비동기 처리가 불가능
자바스크립트는 Async + Non-Bloking Model 을 채용함 (현재 실행중인 코드 실행이 끝나지 않아도 다음 코드 호출)
자바스크립트는 각 명령들이 순서대로 실행될 수 있게 구현되어 있지만, Non Bloking Model에 의해 명령이 아닌 모든 함수는 비동기적으로 실행 됨
Promise
자바스크립트에서 비동기 처리를 동기로 처리할 수 있게 도와주는 객체 유형
Promise 생성자 인터페이스
executor에는 함수만 올 수 있으며 인자로 resolve, reject가 주입됨
executor는 Promise의 실행함수라고 불리고, Promise가 만들어질 때 자동으로 실행됨
프로미스가 연산을 언제 종료하는지 상관 X, resolve, reject중 하나를 무조건 호출
new Promise(executor);
new Promise((resolve, reject) => {
// 명령문
})
Promise Then
Promise Catch
throw
되거나 reject
가 실행되면 catch
메서드에 작성한 함수가 실행됨비동기 함수 (Async Function)
// 비동기 + 일반 함수
async function 함수이름() {
// 명령문
}
// 비동기 + 익명 함수
async function() {
// 명령문
}
// 비동기 + 화살표 함수
async () => {
// 명령문
}
비동기 함수는 함수가 실행되기 전까지 Promise를 생성하지 않음
await 연산자
await
연산자를 사용하면 Promise가 fulfill 상태가 되거나 rejected될 때 까지 함수의 실행을 중단하고 기다릴 수 있음