Asynchronous Programming In Javascript - Pragmatic Promise
1] Promise.resolve and Promise.reject
Promise를 리턴하지 않는 일반적인 값(Javascript value)을 Promise로 리턴할 때 사용한다.
Promise를 인자로 주지 않았으므로, 당연히 오류가 난다.
따라서 두 개의 메서드를 사용하여 Promise를 리턴할 수 있다.
something(Promise.resolve(3));
something(Promise.reject(3));
단, reject의 경우 Error을 던지는 것이 표준이다.
2] Promise.all
여러 Promise를 동시에 실행하고, 하나의 실패도 용납하지 않을 때 사용한다.
특히 여러 HTTP 요청을 동시에 보내고, 전부를 기다린 다음에 실행할 때 사용한다.
인자로 하나의 array 또는 iterable을 인자로 받고 하나의 Promise를 리턴한다.
Promise.all은 하나라도 실패하면, rejected된 Promise를 리턴한다.
(1) 전부 성공시 PromiseResult에 Promise.all의 인자로 준 인덱스대로 값이 들어간다.
(2) 하나라도 실패 시 PromiseResult에 가장 빨리 실패한 Promise의 reason을 담아 표시한다.
Further Details
(1) Promise로 이루어진 array를 인자로 받지 않아도 된다. Promise가 아니면 모두 resolve 처리 한 것과 같다.
(2) 빈 배열도 삽입 가능하다. 이때는 fulfilled가 되며, 빈 배열을 값으로 가진다.
(3) 코드로 구현하면 다음과 같다.
3] Promise.allSettled
Promise.all과 동일하게 여러 Promise를 동시에 실행한다. 단, fulfilled나 rejected 상태와 상관 없이 모든 결과를 리턴해준다.
따라서 a Array of Promsies를 인자로 받아서 항상 fulfilled한 한 개의 Promise를 리턴한다.
이 때 PromiseResult Array의 각 item은 단순한 값이 아니라 status가 fulfilled 상태면 value를, rejected 상태면 reason을 가진다.
Further Details
(1) Promise.all과 같이 값으로 이루어진 array를 인자로 받을 경우
(2) 빈 배열을 받을 경우
(3) 코드로 구현하면 다음과 같다.
4] Promise.race
가장 빠른 응답 1개만을 필요할때 사용한다.
성공이든, 실패든 가장 빠른 응답을 리턴한다.
빈 배열일 경우 pending을 리턴하며, 값을 인자로 줄 경우 에러를 던지더라도 항상 fulfilled를 리턴한다.
Further Details
(1) 성공일 경우
(2) 실패일 경우
(3) 빈 배열일 경우
(4) 값을 줄 경우
(5) 코드로 구현하면 다음과 같다.
5] Promise.any
가장 빠른 성공적인 응답이 필요할 때 사용한다.
하나라도 fulfilled인 Promise를 주면 fulfilled 상태의 Promise를 리턴한다.모든 Promise가 rejected 될 때만 rejected 된다.rejected가 되면, 모든 Promise의 reason을 갖고 있는 aggregate error object를 리턴한다.
(1) 성공이 있을 때
(2) 모두 실패일 때
AggregateError는 다수의 에러를 갖고 있는 javascript의 특별한 error 이다.
한번에 한 개의 에러보다 많은 에러를 던질 필요가 있을 때 사용한다.
그럴 때 모든 에러를 AggregateError로 래핑하여 던진다.
errors property에 이 object에 의해 래핑된 에러들의 배열이 있다.
주의할 점은, 이 에러의 순서는 일찍 받은 순서대로가 아니라 인자로 준 Promise의 순서와 같다.