일단 JS엔진은 하나의 스레드로 이루어져 있어 동시에 단 하나의 작업만을 수행할 수 있다. 하나의 스레드에서 모든 일을 처리하기엔 무리가 있어 API라하는 다른 스레드로 비동기 처리를 진행한다.
Event Loop와 Queue를 이용하여 비동기 처리 과정을 수행할 수 있다.
Call Stack에 작업이 들어간다. 해당 작업이 비동기 작업이라면 브라우저에 존재하는 Web API로 보낸다. 직접적인 처리를 Web API에서 수행한다. 등록했던 Callback을 Queue로 보낸다.
Event Loop를 이용하여 Queue에 존재하는 callback을 call stack으로 보낸다. 이 때 call stack에 아무것도 없어야 Event Loop가 callback을 call stack에 집어넣을 수 있다.
callback의 단점을 보완하기 위해 나왔다. 순차적으로 처리할 수 있다.
pending, fulfilled, rejected와 같은 상태가 존재한다.
.then
을 이용하여 지정한 함수를 호출할 수 있다. 첫번째 인수는 작업 수행이 완료 됐을때, 두번째 인수는 작업 수행이 실패했을때 실행되는 함수 입니다. 이를 이용해 callback 보다 가독성이 높은 코드를 작성할 수 있다.
.catch
를 이용하여 에러 처리를 할 수 있다. .catch
또한 Promise를 반환할 수 있기때문에 .then
을 붙여 이어서 작업할 수 있다.
.finally
는 fulfilled와 rejected 상태에서 호출된다.
then과 catch 둘 다 사용할 수 있지만 catch를 사용하는것을 권장한다.
promise.then(f1).catch(f2);
promise.then(f1, f2);
첫번째 코드는 f1에서 에러가 발생하면 catch로 에러를 처리할 수 없지만
두번째 코드는 f1에서 에러가 발생해도 에러를 처리하지 못한다.