45 Promise 이해하기
공부하다가 내가 이해한대로 적어보는 Promise
Promise 도입 이유
비동기 함수 호출시 내부 비동기로 작동하는 코드가 완료되지 않아도 즉시 종료, 즉 예측히 어렵고 기대한대로 동작하지 않음.
아래 그림처럼 조련되지 않은 강아지. 같은 느낌??
하지만, Promise는 조련이 잘된 강아지라 예상된 값을 가져오고, 값을 잘 관리하기 쉬운 장점이 있음 .
Promise 흐름
먼저,
new Promise((reseolve, reject) =>{
비동기 처리 수행
if(비동기 성공) {
resolve('result');
}else{ //실패
reject('failure reason');
}
})
처음에 Promise가 실행되면, pending이 됨, 예를들어, 새를 사냥하는데 성공적일경우 (fulfilled상태) , resolve 라는 강아지가 가서 값을 가져오고, (결과를 보고 결과에 따라서 강아지 1마리만 내보냄)
실패,놓칠경우에는 reject이라는 강아지가 가서 탄피나 결과물 말고 다른 것들을 가져옴.
가져올때 바로 값을 가져오는건 아니고, 먼저 보라색, reject 강아지는 catch를 지나서 오면서 promise를 리턴하고, 때에 따라 finally로 후속처리 예 밥을 준다던가..
resolve 강아지는, then을 지나서 오는데, 이때 오다가 에러가 있을경우 문제가있을 경우에는 catch를 거쳐서 에러를처리한뒤에 Promise를 리턴한다. 때에 따라 finally로 후속처리
finally는 강아지 resolve, reject 상관없이 수행시 지나는 관문.
위의 코드처럼 함수로 호출도 되지만 정적 메소드로도 호출되는 resolve, reject
const res = Promise.resolve([1,2,3]);
res.then(console.log) ///[1,2,3]
위 아래 동일함
const res = new Promise(resolve =>resolve([1,2,3]));
res.then(console.log) ///[1,2,3]
const rej = Promise.reject(new Error('error'));
rej.catch(console.log) ///Error :error
위 아래 동일함
const rej = new Promise((_,reject) => reject(new Error('error')));
rej.catch(console.log) ///Error :error
또 다른 메서드로는 Promise.all Promise.race Promise.allSettled 이 있음
먼저, 아래 그림처럼 Promise 가 여러개있을 경우 사용하고 all 버튼을 누르면 강아지들의 집 문이 동시에 열리고 강아지를 내보냄. 이때, 도착 순서 없이 집 순서대로 강아지를 줄 맞추는게 all이고,
집 순서 상관없이 강아지를 오는 순으로 결과물을 받는게 race
allSettled는 ES11 2020년에 도입되었는데, fulfilled reject 상관없이 모든 처리 결과 담겨져있음. (모든 강아지 다 내보내서 받아옴)
Promise 관련해서 알아두면 좋을 내용
- 마이크로 큐 : 프로미스 후속처리 메서드의 콜백함수는 마이크로 큐에 저장되는데,(then,catch,finally 안의 함수) 이것은 일반적인 콜백함수 (태스크 큐에 보통 저장) 보다 우선순위가 높다.
- fetch : XMLHttpRequest 처럼 HTTP요청 전송 하는 클라이언트 사이드 web API 프로미스를 지원하고 사용법이 간단함(그래서 then, catch, fianlly사용가능)
const promise = fetch(url, [option]);
Author And Source
이 문제에 관하여(45 Promise 이해하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ljo9191/45-Promise-이해하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)