자바스크립트는 유난히도 비동기적 작동을 많이 한다.
자바스크립트 자체가 비동기적인 언어라는 느낌이다.
사실 맞다.
비동기적인 작동을 하기 위해서 만들어진 언어다.
동기적 작동도 수행하지만 promise와 asnyc-await를 주로 사용해서 비동기적인 동작을 많이 수행한다.
자바스크립트를 익힌지 얼마 안된 초보에게 promise는 도대체 왜! 쓰이는지? 그리고 도대체 왜! 이렇게 동작이 되는지? 많이도 헷갈렸다.
mdn 공식문서에서는 Promise를 이렇게 설명한다.
조금? 아니 많이 헷갈린다.
그도 그럴 것이 비동기적인 동작을 수행해야 할 필요성을 느끼지 못할 정도로 컴퓨터과학적인 지식이 부족하고 경험이 부족하기 때문에...
하지만 네트워크와 데이터베이스를 배우고 서버 관련된 데이터로직을 처리하는 방법을 배우기로 한 이상! 비동기적 함수를 사용하는 것은 필수이다. 아니? 필연이다.
Promise는 아래의 세 가지 중 하나의 상태를 가진다.
Promise가 이 "상태"를 갖는다는 것을 이해하는 것이 중요하다.

동기적인 동작만을 하는 코드를 작성했다면 프로그램이 실행될 때 우리가 작성한 코드의 순서 그대로 진행이 될 것이다.
하지만, 우리는 현재 실행하고 있는 프로그램에 대해서만 제어가 가능하다.
해당 프로그램을 실행하는 코드 내에서 CRUD를 실행하려해도 해당 프로그램의 권한 밖 (다른 곳에서 실행되는 동작)에서는 우리가 할 수 있는 것이 없다.
예를 들자면 이런 것이다.
우리가 클라이언트 프로그램에 대한 코드를 작성 중에 서버로부터 데이터를 요청하려한다.
서버에서 응답이 올 때까지 프로그램이 동작하지 않고 멈춰있을 수는 없다.
서버가 언제 응답이 올 지 모르기 때문이다.
그럴 때는 서버가 응답이 왔을 때 동작해야 할 기능들을 구현해야 한다.
그럴 때 쓰는 것이 비동기적인 함수의 구현인 것이다.
프로그램이 제어할 수 없는 부분에 대해서 "예방"을 할 수 있도록, 그리고 자연스러운 동작이 될 수 있도록 돕는 것이 바로 이 "비동기적" 동작인 것이다.
이것을 이해해야만 Promise를 이해할 수 있다!
이제 비동기적 함수를 왜 써야하는지 그리고 어떻게 써야할 지에 대해 감이 잡히기 시작했다.
async는 그럼 어떻게 동작할까?
아래는 예시 코드다.
Promise.resolve().then(console.log('a'));
console.log('b');
function syncF(){
console.log('c');
}
async function asyncF() {
console.log('d');
await Promise.resolve(console.log('await?'));
console.log('e');
return true;
}
asyncF();
syncF();
자, 실행하면 어떻게 출력될까?
원래 예상대로라면
b c a d await? e 가 순서대로 나올 것 같았다.
출력결과는?

async 함수 내에서 await가 사용된 다음 코드 라인부터 비동기적으로 동작이 처리된다.
그 전까진 동기적으로 동작이 처리된다...
이건 조심해야겠다.
그림 참조: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise