# Asynchronous Programming In Javascript - Pragmatic Promise

# 1\] Promise.resolve and Promise.reject

Promise를 리턴하지 않는 일반적인 값(Javascript value)을 Promise로 리턴할 때 사용한다.

![](https://blogger.googleusercontent.com/img/a/AVvXsEj5ww7nHtD4me5O5_N9DrzJdjMfWJ__V80l1LDlJA8MnzK5Vhsl2hGY90u-aizfdi4psknu_Mkdk-T6WfexkwVX0kHWVjdTOzSW4W6lfjSxHUGpruqZ7T0D9xmxcK8j-lWWmdbWUVeFYtytPge6zYraxVaTbO7Q0FK7kss-GQOza3NN82gz-B0eck616yNW=w411-h140 align="left")

Promise를 인자로 주지 않았으므로, 당연히 오류가 난다.

따라서 두 개의 메서드를 사용하여 Promise를 리턴할 수 있다.

something(Promise.resolve(3));

something(Promise.reject(3));

단, reject의 경우 Error을 던지는 것이 표준이다.

![](https://blogger.googleusercontent.com/img/a/AVvXsEjniYqNasRKNkyu5GqtIgSbELg0AIqofJTdEB51XI-SoLU_aJVoL6PwjwjC2wV6ijt9Et903pvWBAaSuAIItPi2Fe2vGDO2VGYqGM5WABoDIo-XvHHtjuFk86fLcuanWsLMtNBohbF_m8gVNM5kujZ3wdQRh7OHnEvVZnJNmJEYX35q8NLaoW1SWyzfabq-=w397-h139 align="left")

# 2\] Promise.all

여러 Promise를 동시에 실행하고, 하나의 실패도 용납하지 않을 때 사용한다.

특히 여러 HTTP 요청을 동시에 보내고, 전부를 기다린 다음에 실행할 때 사용한다.

인자로 하나의 array 또는 iterable을 인자로 받고 하나의 Promise를 리턴한다.

Promise.all은 하나라도 실패하면, rejected된 Promise를 리턴한다.

#### (1) 전부 성공시 PromiseResult에 Promise.all의 인자로 준 인덱스대로 값이 들어간다.

![](https://blogger.googleusercontent.com/img/a/AVvXsEi5LruLIVK9JrvN2uDqv2bMfDcctbCz_gfIWuOJqOksz7LRIs9-8k-aMn_3FkcSCqA3r4Y_aVADDZhRCzwUcmeMnX34Up8gwTTkoY5bDHO0IbKkq0OQnaEXnWAIQjD-9MEyLVNLt5yBchVOwW7pUL9qZOvqwMzIzSjOPh0JecRiMF5lk_xMt0MRKwboc5w-=w373-h405 align="left")

#### (2) 하나라도 실패 시 PromiseResult에 가장 빨리 실패한 Promise의 reason을 담아 표시한다.

![](https://blogger.googleusercontent.com/img/a/AVvXsEjMq0LHh3u1YH0obBdqdoTtd9efxQCaS2wGIoMykOYk7CP-knsYEPHc_fSEdUjbxq3TR5eAcbqygFvJV4t1GeZZW2ltT2hiE0i2UfnMhMM78J6A-Htyp3qDWVev1ILIk4QUZCzk13suM7nJLlMfrh2Qn4Zjdr7-CilIAYhw9oogQ1-FwgweetCSPZ43jD5u=w388-h371 align="left")

### Further Details

#### (1) Promise로 이루어진 array를 인자로 받지 않아도 된다. Promise가 아니면 모두 resolve 처리 한 것과 같다.

![](https://blogger.googleusercontent.com/img/a/AVvXsEiOv9shQaR1fKKbItnfy9ZaOcbgnqZnwmgIE8b1YeAhqbvebYJBfsBIHoBgHRRiFf-2Fbg-Rr1qESixmABlov5jfdqolEFOYuyfY8_4CFftUX_eftNMIBQYxq7zmFc2gvCtw31jNUGYhAQ2mAI6wE9WH5lmPDo4eRoYCPOmQ3KNwnyIfGP-wxqSfE7hdO0b=w450-h242 align="left")

#### (2) 빈 배열도 삽입 가능하다. 이때는 fulfilled가 되며, 빈 배열을 값으로 가진다.

![](https://blogger.googleusercontent.com/img/a/AVvXsEivBolwFKjZsSuyvpU5fFhJ-cOLyfvF2F_lDNanrQeZqqd8lFdCLU9_ktgQCvuRjjo1g2bC3x1vLf_kd9w2dktTvqFNcnMGVRJz2GFH3SFXjLcCUdSkcGrFESSjNYV6upC5x52BzAsTk0J7bnnYiHOcc9Yz0iYyYkNUb_9NUFWQboOlgucasXeUFVXbXEoC align="left")

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

![](https://blogger.googleusercontent.com/img/a/AVvXsEhPBhgWxlQRYcbrRn7uqkCuzEAwKXtstsc5_Ybie_JLptqXqdKOAmpTYbq7wi_WbEcG0BOMPt8RXnXpsznlBtcmNgr2JsElVhit2wjAhTe7EagSHsf6oLtEQy-nhs0TaafZZ4iHOsGR48uCly2rrnuTxSwKg-A2PwZn1hSc4nD_yChbQQ0bWXW4ZZpgmEXm=w405-h393 align="left")

# 3\] Promise.allSettled

Promise.all과 동일하게 여러 Promise를 동시에 실행한다. 단, fulfilled나 rejected 상태와 상관 없이 모든 결과를 리턴해준다.

따라서 a Array of Promsies를 인자로 받아서 항상 fulfilled한 한 개의 Promise를 리턴한다.

![](https://blogger.googleusercontent.com/img/a/AVvXsEhIPhboKnjKmnvAR_USp2-DiuTMMaUDZDnq7-rNaa0H0LpYZoInsGrhgkldAk25ede3RWNtFRpPQ-0nOv0m2L8WZ_Nxf6Zgf4pRZVB4i_xWEyp0iJBMTA94hKhYQdtN92qnI0gjLXtM1-CN3pKwPtSNj5Nf9eRSnFeLW-41VLdZgSeagMK9IxgpFo_9jZbL=w418-h443 align="left")

이 때 PromiseResult Array의 각 item은 단순한 값이 아니라 status가 fulfilled 상태면 value를, rejected 상태면 reason을 가진다.

### Further Details

#### (1) Promise.all과 같이 값으로 이루어진 array를 인자로 받을 경우

![](https://blogger.googleusercontent.com/img/a/AVvXsEjF_4SszB6DHkgeSDo3JwHOxh9OJ45KP9huVFL-PZ-uDXRIvX8_4fcM4A1zeJIdzFBLqgS1wyerMg7_LGd6ww-oRUtk-kLZahTe1q1UqIudaKEay4rONSkDPkTsPUNFMcXL9BpVhQy8plQXo7-VUStPlBFUq3VeQZD_AH_-eNGeTusjmu8a6oTw0zKJNdPw align="left")

#### (2) 빈 배열을 받을 경우

![](https://blogger.googleusercontent.com/img/a/AVvXsEhgf3hjsyrhSf2OJCsXb_upxR3YnAhgDlfuMYVO0r21l5OOf9HtmQoQaaVNiS3UesgqdDyB05kFO57LdlYRSg9JitATaQTuSoEWi0p80TdZueHRLaqMzsADwwktzTpTzaKywibG8pYoitCgTnhy0lj-yy_Mf8_hnda1sgcrbBy-QdQBCX0pSgoKVjTVSnL6 align="left")

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

![](https://blogger.googleusercontent.com/img/a/AVvXsEjrqddQ6DbepxN367VNdyy9wkDywbCn-zI8W9oD1x3d8L-ffNB4a9u1A0qo1uQ5_BnXxjBFPQr78a9gRzG0ft59c8WoCAkrhONeNCjleIXJp0BkPd9XSjNMgtMBNb-ptlGEkXq4LiPGs6y9p-2YAdT89MbPgvg6e5eUFGIW485YsZXtTuwMaFwxlg543pis=w388-h506 align="left")

# 4\] Promise.race

가장 빠른 응답 1개만을 필요할때 사용한다.

성공이든, 실패든 가장 빠른 응답을 리턴한다.

빈 배열일 경우 pending을 리턴하며, 값을 인자로 줄 경우 에러를 던지더라도 항상 fulfilled를 리턴한다.

### **Further Details**

#### (1) 성공일 경우

![](https://blogger.googleusercontent.com/img/a/AVvXsEjEPMKe3N5dMb2xeKMl0gijJp264RU3VtxPtGH256pv2WMM3VYVNXhd2VRpU_PThS1pNlzA96NIUkkNBUZzAdAeAfB0FmpJkiMz9s1vWgLYfeh7Uv7XLozklHsJzmbZNfbtjlsxuworOqQu7Fc68SuS5rQ9T-WzEFk6ITzviImh5MdFlat_CHTcwrv4UIbI=w331-h361 align="left")

#### (2) 실패일 경우

![](https://blogger.googleusercontent.com/img/a/AVvXsEjqUR9JBmPlmRU9Auff4knhiO21gdbZ6dknuJavobG4rLZlAJkJGOLEVIYY-5_uDE_qZldrDsO2xBUuSkNMoktnQ40O-nWjccrxgrXbvMo6Fhxu2grwntrUCVzp92Cg1yLGG1gnfkTzw7gBtk6KSAOia5OQTuyPwbP1ZOoyPIDkxcd80ckdzobRYcJqlmzG=w358-h366 align="left")

#### (3) 빈 배열일 경우

![](https://blogger.googleusercontent.com/img/a/AVvXsEgLyTTI-Dt3lnUQXR_hnX2ZpRMDX7y2jqd9xnnU9lbRmjo_CM5tpgZdxO92D93GqlXTJZ9hYePimV_Lig1qLH_gR2LqCyPq_WM0LL7m-Moa4OflyvW3iQgM6kyPGLKKDT4K1JiJ6aidIsDgm2VwoIqkyMXoKy8K-sb18cVomFC5oUjDT6JGIJrInG7_Mkht align="left")

#### (4) 값을 줄 경우

![](https://blogger.googleusercontent.com/img/a/AVvXsEihh-Xm8bastIVkRfxYNEqlkKzTtp9veIh02Md45MMe1e4Vog7rUOrU-L6bhlbyx-yuCKlCQs3UxZ7kgOkFp3wD4kuJYn4mMGBCWCqjPOJIXfAh_H4D1igzv2ZnV5IXm0rvJc4X7oy6B43q0-Ygcj0k11FvFNHzf5lF-Le_Uzh_Ypzkvrt6L5pKzU-Npyct=w455-h128 align="left")

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

![](https://blogger.googleusercontent.com/img/a/AVvXsEiUSCUk03vzidEFkGFoKqBpnEycM_cLyBVlG0PH4_eZ9KkfwabNR_qOJ3fTyUkSwPKO3o3L7jVmCbxuA8L2OEoV59kb4HZSLKk7VbOfYyXXXfKRBNvCXpgAwS7dmfEWUNKSfs24RvjCwUqMsotd7KyWa6APPGheRxO01-b4enrorEK_4mfo4UL_yw1RbzbA=w447-h375 align="left")

# 5\] Promise.any

가장 빠른 성공적인 응답이 필요할 때 사용한다.  
하나라도 fulfilled인 Promise를 주면 fulfilled 상태의 Promise를 리턴한다.모든 Promise가 rejected 될 때만 rejected 된다.rejected가 되면, 모든 Promise의 reason을 갖고 있는 aggregate error object를 리턴한다.

#### (1) 성공이 있을 때

![](https://blogger.googleusercontent.com/img/a/AVvXsEidDwuk90Af-Y2TgW_OYKRdW9Yx1rueFqnYik0P_Ta0HZ_-qo51fDBRblUIc5NeO5Bed3ngD0ifl7PfZZpJeN4HAk6Vus4e4juG-bMaWPIBB_uIRbcqaQUIK0Imf0Oe2aqoSBhZTbRc9b4ai-m6w9uHOb7iE1Gkha0oh06CGBcp0OdbKG5oV32t33KDYNmS=w417-h410 align="left")

#### (2) 모두 실패일 때

![](https://blogger.googleusercontent.com/img/a/AVvXsEgNuOhcHPEiA3Q8OEv9akzKThtYLh8OW5fHPjJNbahH_34kxan1BE9dmE4IVV3hAs4cT_kHddFNwBYU5jgjbzg3h7_L9gsQNbIvMBLyLjwc0npDBk6BC31CvK6mIId9OgHdY1ORPZCy6FuYyLUX-UtwRClu1LMCH-hrACOIfL-Ot7RUX5dhWvLeLcxfRZE5=w454-h504 align="left")

AggregateError는 다수의 에러를 갖고 있는 javascript의 특별한 error 이다.

한번에 한 개의 에러보다 많은 에러를 던질 필요가 있을 때 사용한다.

그럴 때 모든 에러를 AggregateError로 래핑하여 던진다.

errors property에 이 object에 의해 래핑된 에러들의 배열이 있다.

주의할 점은, 이 에러의 순서는 일찍 받은 순서대로가 아니라 인자로 준 Promise의 순서와 같다.

### Further Details

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

![](https://blogger.googleusercontent.com/img/a/AVvXsEhlp5pSmiUY8Hxt_Etvo3tw99JcOc3l4eddUBYtPuOiRplqtsCwV2Wkmg7h5SghuEcGCy6fCpoH5d_sBwhp548SlY7yKcMr1lfxgSgeptBENg6IRLUp7Cm5IleFpI8ZDknDjjRdPLhVO4Of6_Po-7UBbp8kA2eEK8UExiwrpe5THp1RqIhDvedXi5hYkmzX align="left")

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

![](https://blogger.googleusercontent.com/img/a/AVvXsEjK3s49_nfu4DAYjei_j_EsILERxEgkx6FV9332eY32qqdZof6M0MKv3dSTNz7jmt4GFgtVe8uzztnJt3OYopA6FgPUxvTISWB0Bx55iekQmYXCxhuM9Yuvl328VzMji501yYaHP26F0Py68FeWWytvv0SeGeL6tZOFxXNL_VOq7U1h2dJJjm2GGBYfV8EM align="left")

![](https://blogger.googleusercontent.com/img/a/AVvXsEh81JHuDDXB8_Rl3lMSY0hWjCfzSnxq-OuuaGa1oBLK1DXcZaX39VBO7Qk5KhTBY2Vs9Y7HO3Te78pwNPSMrjDsfMhTGzoIj59BrzbM2DgvcStxkR6pzHt-4XkIDfl745m9IoohR93pZUc2r6RfZzI4ZbVMFSVSjxMyLZRALUyBjqDzzB2bWp45NzA9amBC=w322-h359 align="left")

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

![](https://blogger.googleusercontent.com/img/a/AVvXsEilCLB8Hn6G6LGBF48hS0u-hpSd1Ymh9b-g6QK9Du-CeYT-dVxOrVLH5Z0j_ca-ZgtVKiZbneqChCZgrv-hfEuTne_bAiBJJvJPHuzrz84_p0X-RE68GimUbbhvrh6uqIJwKW_71iRoicuiuaqUsJ368KfS72nJ4EnCvMkfOlRSqRvcuYyFDRaUyDHpIMDy=w557-h506 align="left")
