Skip to main content

Command Palette

Search for a command to run...

Asynchronous Programming In Javascript - Pragmatic Promise

Updated
•2 min read•View as Markdown

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의 순서와 같다.

Further Details

(1) 빈 배열을 줄 경우도 실패한다.

(2) 값을 줄 경우 왼쪽 순서부터 제일 빠른 인자를 value로 주며 fulfilled Promise를 리턴한다.

(3) 코드로 구현하면 다음과 같다.

More from this blog

RFC 9110 HTTP Semantics - TRACE

1] TRACE trace는 요청 메시지의 원격 application-level의 loop-back을 요청한다. 요청의 최종 수신자(final recipient)는 민감한 데이터를 포함한 필드를 제외하고 수신한 메시지를 200(OK) 응답의 내용으로 클라이언트에 다시 반영해야 합니다.(should) message/http 형식은 이를 수행하기 위한 한 가지 방법이다. 최종 수신자는 Origin Server이거나 요청에서 Max-Forwards ...

Nov 28, 20241 min read

RFC 9110 HTTP Semantics - POST

1] POST POST 메서드는 target resource가 리소스 자체의 특정한 의미에 따라 요청에 포함된 representation을 처리하도록 요청한다. 예를 들어, 다음의 기능을 수행한다. HTML form에 입력된 필드같은 데이터 블록을 데이터 처리 프로세스에 제공 게시판, 뉴스 그룹, 메일링 리스트, 블로그, 또는 비슷한 기사 그룹에 메시지 게시(posting) origin server에서 식별되지 않은 새로운 리소스 생성 ...

Nov 2, 20242 min read

RFC 9110 HTTP Semantics Method Definitions GET

1] GET GET Method는 대상 리소스에 대한 현재 선택된 representation의 전송을 요청한다. 성공적인 응답은 대상 URI가 식별한 동일성의 품질을 반영한다.(계속 요청하면 항상 동일한 응답을 줌) 따라서 HTTP를 통해 식별 가능한 정보를 검색하는 것은 일반적으로 GET 요청을 통해 수행되며 200(OK) 응답을 준다. 리소스 식별자를 원격 파일 시스템 경로명으로, representation을 해당 파일 콘텐츠의 복사본으로 ...

Oct 9, 20243 min read

Spring Data JPA Dynamic Projections

1] 기존 Projections 특정한 Entity의 컬럼을 전부 가져오고 싶지 않을 때, 기존의 경우는 메서드마다 record를 생성하였다. 이때, 출처에서 적힌 것처럼, 여러 메서드가 하나의 record를 쓰는 경우가 생기게 된다. 예를 들어, 컬럼이 id, name, genre, 등등이 있을 때 기존에 id와 name만을 가져오는 record가 있을 경우 id, name, genre를 가져오는 메서드를 만들 경우 기존의 record에 ge...

Sep 25, 20242 min read

Jong-Dae's Coding Docs

17 posts