{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/21-02-03-promise-call/",
    "result": {"data":{"site":{"siteMetadata":{"title":"irrationnelle","author":"irrationnelle","siteUrl":"https://dev.rase.blog","comment":{"disqusShortName":"","utterances":"irrationnelle/devlog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"7f8b6019-e34c-56bf-9153-bb5a9a26de7e","excerpt":"Promise 실행과 평가 시점에 대하여 코드 리뷰를 하는 중에 다음과 같은 코드를 보았다. 나는   의 조건과 상관없이  를 실행하기 때문에  를 조건문보다 위로 이동시키는 게 어떠느냐고 리뷰했다. 답변은 그렇게 하면 항상  가 끝난 뒤  가 작동하기 때문에 시간적으로 손해라는 것이었다.   를 연이어서 두 번 사용하기 때문에 A+B 시간이나 B+A 시간이나 다를 게 없다고 생각한 나는 반론했다. 내 반론에 대하여   을 호출한 시점에서 이미 Promise 내부의 operation…","html":"<h1 id=\"promise-실행과-평가-시점에-대하여\" style=\"position:relative;\"><a href=\"#promise-%EC%8B%A4%ED%96%89%EA%B3%BC-%ED%8F%89%EA%B0%80-%EC%8B%9C%EC%A0%90%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC\" aria-label=\"promise 실행과 평가 시점에 대하여 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Promise 실행과 평가 시점에 대하여</h1>\n<p>코드 리뷰를 하는 중에 다음과 같은 코드를 보았다.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">const</span> fetchSomething <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Promise</span><span class=\"token operator\">&lt;</span><span class=\"token builtin\">unknown</span><span class=\"token operator\">></span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>hasResult<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> existingResult<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token keyword\">return</span> <span class=\"token function\">internalPromise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> someTask<span class=\"token operator\">:</span> <span class=\"token builtin\">Promise</span><span class=\"token operator\">&lt;</span><span class=\"token builtin\">unknown</span><span class=\"token operator\">></span> <span class=\"token operator\">=</span> <span class=\"token function\">fetchSomething</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">let</span> result <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>isFlag<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">await</span> <span class=\"token function\">otherTask</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\tresult <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> someTask<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\nresult <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> someTask<span class=\"token punctuation\">;</span></code></pre></div>\n<p>나는  <code class=\"language-text\">isFlag</code> 의 조건과 상관없이 <code class=\"language-text\">someTask</code> 를 실행하기 때문에 <code class=\"language-text\">await someTask</code> 를 조건문보다 위로 이동시키는 게 어떠느냐고 리뷰했다.</p>\n<p>답변은 그렇게 하면 항상 <code class=\"language-text\">someTask</code> 가 끝난 뒤 <code class=\"language-text\">otherTask</code> 가 작동하기 때문에 시간적으로 손해라는 것이었다.</p>\n<p><code class=\"language-text\">await</code>  를 연이어서 두 번 사용하기 때문에 A+B 시간이나 B+A 시간이나 다를 게 없다고 생각한 나는 반론했다. 내 반론에 대하여  <code class=\"language-text\">fetchSomething</code> 을 호출한 시점에서 이미 Promise 내부의 operation 은 실행하고 있다는 뉘앙스의 답변을 받았다.</p>\n<p>결국 나는 playground 를 만들어서 아주 간단하게 테스트를 해보았다.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">somePromise</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">new</span> <span class=\"token class-name\"><span class=\"token builtin\">Promise</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>resolve<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'start promise'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">'hello world!'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span> <span class=\"token operator\">*</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token function\">somePromise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>이번에 공부해서 정확하게 알게 된 것은, Promise 는 3가지 상태를 가진다는 것이다. <a href=\"https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise\">참고</a>.  그 중 pending 상태는 아직 평가를 내리지 않은 상태인데, 나는 이 pending 상태에서는 promise 내부에서 어떤 operation 도 실행하지 않는다고 생각했다.</p>\n<p>하지만 위 예제에서 <code class=\"language-text\">somePromise()</code> 를 호출하고 나니 바로 <code class=\"language-text\">start promise</code> 라는 결과가 나왔다.</p>","frontmatter":{"title":"Promise 실행과 평가 시점에 대하여","date":"February 03, 2021"}}},"pageContext":{"slug":"/21-02-03-promise-call/","previous":{"fields":{"slug":"/21-01-03-unavailable-import-on-typescript/"},"frontmatter":{"title":"Typecript 에서 Cannot use import statement outside a module 에러 해결","category":"typescript","draft":false}},"next":{"fields":{"slug":"/21-02-03-test-spec-why-fail/"},"frontmatter":{"title":"테스트 코드는 왜 스펙인가","category":"Dev","draft":false}}}},
    "staticQueryHashes": ["3128451518","3474900066"]}