목차
1. promise란?
2. 사용하는 이유
1. promise란?
- 비동기 작업의 완료와 에러를 판단하는 객체
promise라는 단어의 뜻은 약속이라는 뜻이다. 프로그래밍에서도 비슷한 의미라고 할 수 있는데 약속이 많은 것을 포괄하는 것이 아닌 "내 작업이 끝날 때까지 기다려줘"라는 것이다. 일반적으로 JS에서는 싱글스레드이기 때문에 동기적으로 작업을 진행하지만 간혹 시간함수나 ajax같은 비동기 작업을 만날 때는 동기방식과는 다른 방식으로 진행된다.
① 콜 스택에 작업이 들어왔을 때 비동기 작업은 web api로 이동하여 대기한다.
② 일정 시간이 지나거나 상태가 변하면 task queue에 작업이 쌓인다.
③ event loop는 task queue에 있는 작업을 확인한다. call stack에 전달한다.
④ 작업이 있다면 evnet loop는 해당 작업을 call stack에 전달한다.
⑤ 작업이 실행된다.
어러한 작업에 대해 동기를 맞춰주기 위해 사용하며 다음과 같은 문법으로 사용하면 된다.
new Promise((성공함수,실패함수)=>{
//비동기 코드
if(성공시){
성공함수(결과값)
}else{
실패함수(에러값);
}
}).then((결과값)=>{
//성공시 코드
}).catch((에러값)=>{
//실패시 코드
})
프로미스는 성공함수와 실패함수라는 두개의 콜백함수를 인자로 받고 성공함수에는 작업이 성공적으로 종료됐을 때 반환할 데이터를 전달하며 여러 개로 선언할 수 있다. catch는 작업 중 어떠한 이유로 에러가 발생하여 작업이 중지되면 실행된다.
2. 사용하는 이유
프로미스를 사용하지 않으면 동기에 맞춰 데이터를 가져올 수 없을까? 있지만 매우 좋지 않다. 바로 콜백을 사용하는 것인데 비동기 작업에서 전달된 값을 전달하고 처리하는 과정 중에 여러 콜백이 사용될 수 있다. 이를 콜백지옥이라고 부르며 가독성과 유지보수성이 프로미스에 비해 매우 떨어진다.
promise를 사용하게 되면 콜백형태의 단점을 보완할 수 있다.