await 키워드 붙이지 않았을 때 try catch 작업의 흐름
-
await
키워드를 사용하면, 마이크로태스크큐에 작업이 들어간다. -
await 을 사용하지 않으면 비동기 함수의 에러를 try-catch 블록에서 잡을 수 없다.
-
await 을 사용하지 않을 경우 비동기 함수는 즉시 실행되고, 그 반환값은 Promise 객체가 된다. Promise 객체의 에러는 try-catch 블록에서 잡을 수 없고, 대신 Promise 자체의 catch 메서드를 사용해야한다.
-
그러면 await 을 붙이면 try-catch 에서 잡을 수 있는 이유는?
- await 키워드는 비동기 함수를 호출 할 때, Promise 가 해결될 때 까지 실행을 일시 중지한다.
- await 키워드가 없으면 비동기 함수는 바로 Promise 객체를 반환하고, 이는 비동기적으로 해결되거나 리젝된다.
- 이 때 try-catch 블록은 동기적으로 실행되므로 Promise 가 해결되거나 리젝될 때 발생하는 에러를 잡을 수 없다.
- 즉, Promise의 해결 혹은 리젝보다 try-catch 블록이 먼저 끝나버림.
- await 을 붙이면 아래와 같이 동작한다.
- await someFun(); 은 someFun()이 반환하는 Promise 가 해결되거나 리젝될 때 까지 실행을 일시 중단한다.
- Promise 가 해결되면 그 결과 값이 반환되고
- Promise 가 리젝되면 catch 블록이 실행된다.
즉, await 을 붙이면 Promise 가 해결 될 때 까지의 코드 실행을 일시 중지시키므로 try-catch 블록이 비동기 함수 내부에서 발생하는 에러를 잡을 수 있다.