프로미스의 장점은 실행됐는데 결과값을 나중에 쓸 수 있는 것
callback
1 | setTimeout(() => { |
1 | function calculator(callback, a, b) { |
콜백의 한 가지 아쉬운 점 → 조건이 달성되면 바로 실행해버림
promise
1 | new promise((resolve, reject) => { |
이 코드는 setTimeout으로만 작성된 코드와 차이점이 무엇일까?
setTimeout은 1초 뒤에 태스크 큐로 넘어가고 콜스택이 비면 바로 실행된다.
프로미스를 사용하면 나중에 결과값을 사용하고 싶을 때 promise.then을 사용해서 사용할 수 있다.
1 | const promise = new Promise...; |
1 | const p1 = axios.get('서버주소1'); |
콜백의 단점: 데이터를 바로 받아야한다.
콜백헬이 왜 안좋은가? 가독성 측면에서 보기 안좋은 것도 있지만,
근본적인 원인은 결과값을 바로 받아야한다는 것이다.
Promise.all
프로미스의 단점: 하나라도 실패하면 catch로 넘어간다.
1 | Promise.all([p1, p2, p3]) |
p1, p2가 제대로 들어와도 p3에서 데이터가 제대로 들어오지 않으면 바로 catch 구문으로 넘어간다.
Promise.allSettled
이를 해결하기 위해서 allSettled가 나옴
1 | Promise.allSettled([p1, p2, p3]).then((results) => {}); |
Promise.allSettled는 모든 처리결과를 반환한다. results는 배열로 반환하기 때문에 filter를 사용해서 실패한 것만 필터링해서 다시 시도할 수 있는 장점이 있다.
Review
비동기 함수가 어떻게 동작하는지 원리는 알고 있었지만 쉽게 사용하지 못했었는데 제로초 프로미스 영상을 보고 프로미스가 왜 탄생하게 된건지, 프로미스를 사용하면 어떤 장점이 있는지에 대해서 알게되었다. (제로초님 폼 미쳤다!)
+) 영상 링크