<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Async on 오늘도 개발을 한다.</title>
    <link>https://cloudsoswift.github.io/tags/async/</link>
    <description>오늘도 개발을 한다. (Async)</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ko-kr</language>
    <lastBuildDate>Tue, 30 Apr 2024 20:47:21 +0900</lastBuildDate>
    
    <atom:link href="https://cloudsoswift.github.io/tags/async/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>[Javascript] Javascript의 비동기 작업 알아보기 (w. Promise, async)</title>
      <link>https://cloudsoswift.github.io/post/develop/javascript/promise-async/</link>
      <pubDate>Tue, 30 Apr 2024 20:47:21 +0900</pubDate>
      
      <guid>https://cloudsoswift.github.io/post/develop/javascript/promise-async/</guid>
      <description>&lt;h2 id=&#34;javascript에서의-비동기-작업&#34; &gt;Javascript에서의 비동기 작업
&lt;span&gt;
    &lt;a href=&#34;#javascript%ec%97%90%ec%84%9c%ec%9d%98-%eb%b9%84%eb%8f%99%ea%b8%b0-%ec%9e%91%ec%97%85&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;기본적으로 Javascript는 싱글-스레드 언어이기 때문에, 오래 걸리는 동기식 코드를 작성하면 해당 코드가 실행되는 동안은 다른 작업을 수행할 수 없습니다.&lt;br&gt;
즉, 해당 코드가 나머지 코드를 블락하게 됩니다.&lt;br&gt;
이를 해소하고자, Javascript에서는 보통 실행엔진이나 브라우저에서 제공되는 &lt;code&gt;Web API&lt;/code&gt;를 사용해 &lt;code&gt;타이머 기반 작업&lt;/code&gt;, &lt;code&gt;타 사이트 요청&lt;/code&gt; 등의 비동기 작업을 처리합니다.&lt;br&gt;
&lt;code&gt;Web API&lt;/code&gt;에는 &lt;code&gt;fetch&lt;/code&gt;, &lt;code&gt;setInterval&lt;/code&gt;, &lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;Promise&lt;/code&gt; 등이 포함됩니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;javascript-runtime.png&#34; alt=&#34;javascript-runtime.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Web API&lt;/code&gt;는 비동기 작업이 끝난 뒤, &lt;em&gt;작업 결과를 바탕으로 실행되는&lt;/em&gt; 콜백 함수를 JS 엔진의 Callback Queue에 전달하게 됩니다.&lt;br&gt;
이후 Event Loop가 Call Stack에서 처리할 작업이 없을 때, Callback Qeue의 작업들을 등록해 처리합니다. &lt;a href=&#34;https://dev.to/bipinrajbhar/how-javascript-works-web-apis-callback-queue-and-event-loop-2p3e&#34;&gt;#&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;과거에는 &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest&#34;&gt;XMLHttpRequest &lt;/a&gt;와 같은 객체를 이용해 웹 비동기 통신을 진행하기도 했으나, 네트워크 상태나 응답속도에 따른 중단 이슈 때문에 deprecated되어 사용하지 않습니다. &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest_API/Synchronous_and_Asynchronous_Requests&#34;&gt;#&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;콜백-함수&#34; &gt;콜백 함수
&lt;span&gt;
    &lt;a href=&#34;#%ec%bd%9c%eb%b0%b1-%ed%95%a8%ec%88%98&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;최신 Javascript 비동기 작업은 대부분 &lt;strong&gt;&lt;code&gt;Promise&lt;/code&gt;&lt;/strong&gt; 객체를 반환하거나, &lt;code&gt;setTimeout&lt;/code&gt;과 같이 인자로 작업이 끝난 뒤 실행할 행동이 정의된 &lt;code&gt;콜백 함수&lt;/code&gt;를 인자로 받게됩니다.&lt;br&gt;
타이머 기반 작업의 경우, 콜백 함수에 별다른 인자가 주어지지 않지만, &lt;code&gt;Promise&lt;/code&gt;에 사용되는 콜백 함수의 경우 작업의 결과(또는 에러)가 인자로 주어지게 됩니다.&lt;/p&gt;
&lt;h3 id=&#34;promise&#34; &gt;&lt;code&gt;Promise&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#promise&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Promise&lt;/code&gt;란, 작업이 완료되지 않은 비동기 작업에 의해 반환된 객체로, 작업의 최종 완료/실패를 나타내는 프록시 역할을 하는 객체입니다.&lt;br&gt;
기존의 함수들이 콜백 함수를 인자로 받던것과 달리, Promise는 &lt;code&gt;then&lt;/code&gt; 또는 &lt;code&gt;catch&lt;/code&gt;를 통해 &lt;code&gt;콜백 함수를 붙이는 방식&lt;/code&gt;으로 코드를 전개할 수 있습니다. 즉, &lt;code&gt;Promise Chaining&lt;/code&gt;이 가능합니다.&lt;/p&gt;
&lt;h4 id=&#34;promise의-구조&#34; &gt;&lt;code&gt;Promise&lt;/code&gt;의 구조
&lt;span&gt;
    &lt;a href=&#34;#promise%ec%9d%98-%ea%b5%ac%ec%a1%b0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;myPromise&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Promise((&lt;span style=&#34;color:#a6e22e&#34;&gt;resolve&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;reject&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;reject&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;error&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;resolve&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;abc&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Promise&lt;/code&gt;는 생성시 &lt;code&gt;executor&lt;/code&gt;라고 불리는 실행 함수를 인자로 받습니다.&lt;br&gt;
이러한 생성 방식 때문에, Promise를 지원하지 않는 함수가 있다면 생성자로 감싸 지원하도록 만들 수 있습니다.&lt;/p&gt;
&lt;h5 id=&#34;실행-함수&#34; &gt;실행 함수
&lt;span&gt;
    &lt;a href=&#34;#%ec%8b%a4%ed%96%89-%ed%95%a8%ec%88%98&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;이는 &lt;code&gt;reslove&lt;/code&gt; 및 &lt;code&gt;reject&lt;/code&gt; 함수를 인자로 받는 함수입니다.&lt;br&gt;
보통 실행 함수는, 비동기 작업을 모두 처리한 뒤 작업이 끝날 때 &lt;code&gt;resolve&lt;/code&gt;를 호출해 &lt;code&gt;Promise&lt;/code&gt;를 &lt;code&gt;이행(fulfilled)&lt;/code&gt;하고, 에러가 발생한 경우 &lt;code&gt;reject&lt;/code&gt;를 호출해 &lt;code&gt;Promise&lt;/code&gt;를 &lt;code&gt;거부(rejected)&lt;/code&gt;합니다.&lt;/p&gt;
&lt;h4 id=&#34;promise의-상태&#34; &gt;&lt;code&gt;Promise&lt;/code&gt;의 상태
&lt;span&gt;
    &lt;a href=&#34;#promise%ec%9d%98-%ec%83%81%ed%83%9c&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;&lt;img src=&#34;state-of-promise.png&#34; alt=&#34;state-of-promise.png&#34;&gt;
&lt;code&gt;Promise&lt;/code&gt;는 &lt;code&gt;대기&lt;/code&gt;, &lt;code&gt;이행&lt;/code&gt;, &lt;code&gt;거부&lt;/code&gt; 중 하나의 상태를 가집니다.&lt;br&gt;
추가로, Promise가 &lt;code&gt;fulfilled&lt;/code&gt;되거나 &lt;code&gt;rejected&lt;/code&gt;된 경우, &lt;code&gt;pending&lt;/code&gt;이 아닌 &lt;code&gt;settled(또는 locked-in)&lt;/code&gt; 상태라고 일컬어집니다.&lt;/p&gt;
&lt;h5 id=&#34;대기pending&#34; &gt;대기(pending)
&lt;span&gt;
    &lt;a href=&#34;#%eb%8c%80%ea%b8%b0pending&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;연산을 이행하지도, 거부하지도 않은 초기 상태입니다.&lt;/p&gt;
&lt;h5 id=&#34;이행fulfilled&#34; &gt;이행(fulfilled)
&lt;span&gt;
    &lt;a href=&#34;#%ec%9d%b4%ed%96%89fulfilled&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;연산이 성공적으로 완료됐음을 의미합니다.&lt;br&gt;
실행함수 내부에서 &lt;code&gt;resolve(value)&lt;/code&gt;를 호출해 &lt;code&gt;.then()&lt;/code&gt;의 인자로 전달될 콜백 함수에 값을 전달합니다.&lt;/p&gt;
&lt;h5 id=&#34;거부rejected&#34; &gt;거부(rejected)
&lt;span&gt;
    &lt;a href=&#34;#%ea%b1%b0%eb%b6%80rejected&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;연산이 실패했음을 의미합니다.&lt;br&gt;
실행함수 내부에서 &lt;code&gt;reject(value)&lt;/code&gt;를 호출해 &lt;code&gt;.catch()&lt;/code&gt;의 인자로 전달될 콜백 함수에 값을 전달합니다.&lt;/p&gt;
&lt;h4 id=&#34;promise-연결chaining&#34; &gt;&lt;code&gt;Promise&lt;/code&gt; 연결(Chaining)
&lt;span&gt;
    &lt;a href=&#34;#promise-%ec%97%b0%ea%b2%b0chaining&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;settled&lt;/code&gt;된, 즉 &lt;code&gt;fulfilled&lt;/code&gt; 되거나 &lt;code&gt;rejected&lt;/code&gt;된 Promise에 추가 작업을 연결하기 위해 &lt;code&gt;then()&lt;/code&gt;, &lt;code&gt;catch()&lt;/code&gt;, &lt;code&gt;finally()&lt;/code&gt; 메서드를 사용할  수 있습니다.&lt;br&gt;
위 메서드들은 &lt;code&gt;Promise&lt;/code&gt;를 다시 반환할 수 있기 때문에, 연쇄적으로 연결할 수 있습니다.&lt;/p&gt;
&lt;h5 id=&#34;thenonfulfilled-onrejected&#34; &gt;&lt;code&gt;then(onFulfilled, onRejected)&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#thenonfulfilled-onrejected&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;promise&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;onFulfilled&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;onRejected&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;두 개의 콜백 함수를 인수로 받고, &lt;code&gt;Promise&lt;/code&gt;를 반환하는 함수입니다.&lt;br&gt;
처음 주어지는 함수는 &lt;code&gt;Promise&lt;/code&gt;가 이행되었을 때, 두 번째 함수는 &lt;code&gt;Promise&lt;/code&gt;가 거부되었을 때를 위한 콜백 함수입니다.&lt;br&gt;
&lt;code&gt;then()&lt;/code&gt;의 매개변수 중 하나 이상을 생략하거나, 함수가 아닌 값을 전달한 경우 핸들러가 없는 것으로 인식해 &lt;code&gt;then()&lt;/code&gt; 이전의 &lt;code&gt;Promise&lt;/code&gt;의 마지막 상태를 그대로 이어받습니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;myPromises&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Promise((&lt;span style=&#34;color:#a6e22e&#34;&gt;resolve&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;reject&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;resolve&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;abc&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;myPromise&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;가나다라&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;r&lt;/span&gt;=&amp;gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;r&lt;/span&gt;)); &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;#34;abc&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;인수로 주어진 핸들러 함수의 결과에 따라, 반환되는 &lt;code&gt;Promise&lt;/code&gt;는 다음과 같은 규칙을 갖습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;콜백 함수가 값을 반환한 경우: 반환되는 Promise(이행됨)는 그 반환값을 결과값으로 갖습니다.&lt;/li&gt;
&lt;li&gt;콜백 함수가 값을 반환하지 않은 경우: 반환되는 Promise(이행됨)는 &lt;code&gt;undefined&lt;/code&gt;를 결과값으로 갖습니다.&lt;/li&gt;
&lt;li&gt;오류가 발생한 경우: 반환되는 Promise(거부됨)는 그 반환값을 결과값으로 갖습니다.&lt;/li&gt;
&lt;li&gt;이행된/거부된 프로미스를 반환할 경우: 반환되는 Promise(이행/거부됨)는 그 프로미스의 반환값을 결과값으로 갖습니다.&lt;/li&gt;
&lt;li&gt;대기중인 &lt;code&gt;Promise&lt;/code&gt;를 반환할 경우: 반환되는 Promise(이행됨)는 그 프로미스의 이행 여부/결과값을 따릅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;catchonrejected&#34; &gt;&lt;code&gt;catch(onRejected)&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#catchonrejected&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;프로미스가 거부되었을 때, 호출될 콜백 함수를 지정하는 함수입니다.&lt;br&gt;
&lt;code&gt;catch(onRejected)&lt;/code&gt;는 실제로는 &lt;code&gt;then(undefined, onRejected)&lt;/code&gt;으로 동작합니다.&lt;br&gt;
&lt;code&gt;onRejected&lt;/code&gt; 함수는 &lt;code&gt;Promise&lt;/code&gt;에서 &lt;code&gt;reject(reason)&lt;/code&gt; 호출 시 인자로 넘긴 &lt;code&gt;reason&lt;/code&gt; 값을 인수로 받습니다.&lt;br&gt;
&lt;code&gt;onRejected&lt;/code&gt; 함수 내부에서 반환되는 값에 따라, 반환될 &lt;code&gt;Promise&lt;/code&gt;가 이행될지, 거부될지 결정됩니다.&lt;br&gt;
&lt;code&gt;Promise&lt;/code&gt;가 거부되고, 이를 처리할 거부 핸들러가 없는 경우, &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Window/unhandledrejection_event&#34;&gt;&lt;code&gt;unhandledrejection&lt;/code&gt;&lt;/a&gt;이벤트가 발생하고, 처리할 거부 핸들러가 있는 경우 &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Window/rejectionhandled_event&#34;&gt;&lt;code&gt;rejectionhandled&lt;/code&gt;&lt;/a&gt; 이벤트가 발생합니다.&lt;/p&gt;
&lt;h5 id=&#34;finallyonfinally&#34; &gt;&lt;code&gt;finally(onFinally)&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#finallyonfinally&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;&lt;code&gt;Promise&lt;/code&gt;를 처리(이행/거부)한 후, 호출할 콜백 함수를 지정합니다.&lt;br&gt;
&lt;code&gt;finally(onFinally)&lt;/code&gt; 역시 동등한 &lt;code&gt;Promise&lt;/code&gt;를 반환합니다.&lt;br&gt;
만약 &lt;code&gt;onFinally&lt;/code&gt; 내부에서 예외가 발생하거나, 거부된 &lt;code&gt;Promise&lt;/code&gt;를 반환하면 &lt;code&gt;finally()&lt;/code&gt;가 반환하는&lt;code&gt;Promise&lt;/code&gt;는 해당 값으로 거부되게 됩니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이외의 반환값은 &lt;code&gt;finally()&lt;/code&gt;가 반환하는 &lt;code&gt;Promise&lt;/code&gt;의 상태에 영향을 주지 않습니다.
&lt;ul&gt;
&lt;li&gt;예시로, &lt;code&gt;Promise.resolve(2).finally(() =&amp;gt; 77)&lt;/code&gt;는 2로 이행됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;또한, &lt;code&gt;onFinally&lt;/code&gt; 콜백은 인자를 받지 않습니다.
&lt;ul&gt;
&lt;li&gt;이는 &lt;code&gt;finally()&lt;/code&gt;가 &lt;em&gt;결과에 관계없이&lt;/em&gt; &lt;code&gt;Promise&lt;/code&gt; 처리 후 수행될 작업(무언가를 처리하거나 정리)을 수행하는데 사용되기 때문입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;콜백함수의-생략&#34; &gt;콜백함수의 생략
&lt;span&gt;
    &lt;a href=&#34;#%ec%bd%9c%eb%b0%b1%ed%95%a8%ec%88%98%ec%9d%98-%ec%83%9d%eb%9e%b5&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;연결된 &lt;code&gt;.then()&lt;/code&gt;에서 콜백 함수가 생략되어도, 다음 체인으로 계속 이어집니다.&lt;br&gt;
따라서 체인의 마지막 &lt;code&gt;.catch()&lt;/code&gt;까지 &lt;code&gt;.then()&lt;/code&gt;의 인자에 거부 콜백함수를 생략할 수 있습니다.&lt;br&gt;
그렇기 때문에 마지막에 &lt;code&gt;.catch()&lt;/code&gt;로 연결 되어있을 때, 즉각적인 오류 처리가 필요하다면 콜백함수 내부에서 특정 타입의 에러를 던져 체인 아래까지 오류 상태를 유지해야 합니다.&lt;/p&gt;
&lt;h4 id=&#34;promise의-동시성&#34; &gt;&lt;code&gt;Promise&lt;/code&gt;의 동시성
&lt;span&gt;
    &lt;a href=&#34;#promise%ec%9d%98-%eb%8f%99%ec%8b%9c%ec%84%b1&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;Promise&lt;/code&gt;에서는 비동기 작업 동시성을 위해 4개의 정적 메서드를 제공합니다.&lt;br&gt;
4개 메서드 모두 &lt;code&gt;Promise&lt;/code&gt;로 이뤄진 &lt;code&gt;iterable&lt;/code&gt;한 객체(ex. &lt;code&gt;Array&lt;/code&gt;)를 인수로 받고, 새로운 &lt;code&gt;Promise&lt;/code&gt;를 반환합니다.&lt;/p&gt;
&lt;h5 id=&#34;promisealliterable&#34; &gt;&lt;code&gt;Promise.all(iterable)&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#promisealliterable&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Promise.&lt;span style=&#34;color:#a6e22e&#34;&gt;all&lt;/span&gt;([&lt;span style=&#34;color:#a6e22e&#34;&gt;promise1&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;promise2&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;promise3&lt;/span&gt;]).&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;((&lt;span style=&#34;color:#a6e22e&#34;&gt;values&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;values&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;인자로 주어진 모든 프로미스가 이행되면 이행되고, 프로미스 중 하나라도 거부되면 거부된 &lt;code&gt;Promise&lt;/code&gt;를 반환합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;iterable&lt;/code&gt;이 비어있는 경우: 반환값이 없는, 이행된 Promise를 반환합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;iterable&lt;/code&gt; 내부에 &lt;code&gt;Promise&lt;/code&gt;가 없는 경우: iterable을 내부에 포함하는, 이행된 Promise를 반환합니다.&lt;/li&gt;
&lt;li&gt;이외의 경우: 인자로 주어진 모든 &lt;code&gt;Promise&lt;/code&gt;가 이행되거나, 한 &lt;code&gt;Promise&lt;/code&gt;가 거부될 때 비동기적으로 이행/거부되는 &lt;code&gt;Promise&lt;/code&gt;(이전까진 Pending 상태)를 반환합니다.
&lt;ul&gt;
&lt;li&gt;반환되는 &lt;code&gt;Promise&lt;/code&gt;의 이행 값의 순서는 인자로 주어진 &lt;code&gt;Promise&lt;/code&gt;의 순서와 동일합니다.&lt;/li&gt;
&lt;li&gt;주어진 &lt;code&gt;Promise&lt;/code&gt; 중 하나라도 거부될 경우, 다른 &lt;code&gt;Promise&lt;/code&gt;의 이행여부와 관계 없이 첫 번째 거부 &lt;code&gt;reason&lt;/code&gt;를 사용해 거부합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;promiseallsettlediterable&#34; &gt;&lt;code&gt;Promise.allSettled(iterable)&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#promiseallsettlediterable&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;모든 &lt;code&gt;Promise&lt;/code&gt;를 이행/거부한 뒤, 각 &lt;code&gt;Promise&lt;/code&gt;에 대한 결과를 나타내는 객체 배열을 반환합니다.&lt;br&gt;
정확히는 결과 배열을 &lt;code&gt;resolve()&lt;/code&gt;의 입력으로 전달하는, pending된 Promise를 반환합니다.&lt;br&gt;
만약, 빈 &lt;code&gt;Iterable&lt;/code&gt; 객체를 인자로 받은 경우, 빈 배열을 반환하는 이미 이행된 &lt;code&gt;Promise&lt;/code&gt;를 반환합니다.&lt;br&gt;
반환된 배열의 각 객체는 Promise 처리 상태(&lt;code&gt;&amp;quot;fulfilled&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;rejected&amp;quot;&lt;/code&gt;)를 나타내는&lt;code&gt;status&lt;/code&gt;와 상태에 따른 값, 즉 &lt;code&gt;fulfilled&lt;/code&gt; 상태라면 &lt;code&gt;value&lt;/code&gt;, &lt;code&gt;rejected&lt;/code&gt; 상태라면 &lt;code&gt;reason&lt;/code&gt;을 갖습니다.&lt;/p&gt;
&lt;h5 id=&#34;promiseanyiterable&#34; &gt;&lt;code&gt;Promise.any(iterable)&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#promiseanyiterable&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;프로미스 중 하나라도 이행되면 이행하고, 모든 프로미스가 거부되면 거부합니다.&lt;br&gt;
즉, 하나라도 이행된다면 첫 번째 이행 값으로 이행되고, 모든 &lt;code&gt;Promise&lt;/code&gt;가 거부되면, 거부 &lt;code&gt;reason&lt;/code&gt; 배열이 담긴 &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError&#34;&gt;&lt;code&gt;AggregateError&lt;/code&gt;&lt;/a&gt; 객체를 반환하는 &lt;code&gt;Promise&lt;/code&gt;를 반환합니다.&lt;/p&gt;
&lt;h5 id=&#34;promiseraceiterable&#34; &gt;&lt;code&gt;Promise.race(iterable)&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#promiseraceiterable&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;프로미스 중 가장 먼저 처리된 것의 결과값을 토대로 이행/거부될 &lt;code&gt;Promise&lt;/code&gt;를 반환합니다.&lt;br&gt;
즉, &lt;code&gt;Promise&lt;/code&gt; 중 하나라도 먼저 이행되면 이행 예정인 &lt;code&gt;Promise&lt;/code&gt;를, &lt;code&gt;Promise&lt;/code&gt; 중 하나라도 먼저 거부되면 거부 예정인 &lt;code&gt;Promise&lt;/code&gt;를 반환합니다.&lt;/p&gt;
&lt;h3 id=&#34;promise를-동기적으로-다루는-방법-async-function&#34; &gt;&lt;code&gt;Promise&lt;/code&gt;를 동기적으로 다루는 방법, &lt;code&gt;async function&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#promise%eb%a5%bc-%eb%8f%99%ea%b8%b0%ec%a0%81%ec%9c%bc%eb%a1%9c-%eb%8b%a4%eb%a3%a8%eb%8a%94-%eb%b0%a9%eb%b2%95-async-function&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;param0&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;param1&lt;/span&gt;, &lt;span style=&#34;color:#75715e&#34;&gt;/* ... */&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;paramN&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;statements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 또는 Arrow Function 형태로도 사용 가능합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;param1&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;param2&lt;/span&gt;, ...&lt;span style=&#34;color:#a6e22e&#34;&gt;paramN&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;statements&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;async function&lt;/code&gt;이란, 여러 &lt;code&gt;Promise&lt;/code&gt;간의 흐름을 순서대로 처리할 수 있는, 즉 여러 비동기 함수들을 동기적인 순서로 진행시키는 함수를 말합니다. 항상 &lt;code&gt;Promise&lt;/code&gt;를 반환할 수 있습니다.&lt;br&gt;
&lt;code&gt;async function&lt;/code&gt;은 0개 이상의 &lt;code&gt;await&lt;/code&gt; 키워드를 포함할 수 있는데, &lt;code&gt;await&lt;/code&gt;가 달린 &lt;code&gt;Promise&lt;/code&gt;를 만나게 되면 해당 &lt;code&gt;Promise&lt;/code&gt;가 이행/거부될 때 까지 함수 실행을 일시 중단하며, 처리가 된 뒤 다시 진행됩니다.&lt;br&gt;
즉, &lt;code&gt;Promise&lt;/code&gt;를  반환하는 함수를 동기식인것 처럼 동작하도록 해줍니다.&lt;/p&gt;
&lt;h1 id=&#34;참고-문서&#34; &gt;참고 문서
&lt;span&gt;
    &lt;a href=&#34;#%ec%b0%b8%ea%b3%a0-%eb%ac%b8%ec%84%9c&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise&#34;&gt;Promise() 생성자 - JavaScript | MDN (mozilla.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise/then&#34;&gt;Promise.prototype.then() - JavaScript | MDN (mozilla.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch&#34;&gt;Promise.prototype.catch() - JavaScript | MDN (mozilla.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally&#34;&gt;Promise.prototype.finally() - JavaScript | MDN (mozilla.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function&#34;&gt;async function - JavaScript | MDN (mozilla.org)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
