{"data":{"site":{"siteMetadata":{"title":"lastrites2018","author":"lastrites2018","siteUrl":"https://lastrites2018.netlify.com","comment":{"disqusShortName":"","utterances":"lastrites2018/gatsby-first-blog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"5b18a954-0d65-545b-8f88-2e7b4978b633","excerpt":"Asynchronous call 비동기 호출 콜백 callback : 파라미터로 넘겨줘서 나중에 실행되는 함수. 다른 코드의 인수argument로서 넘겨주는 function을 말한다. 바로 실행되는 녀석이 아니다. ex) iterator(동기함수), event handler(비동기함수, 이벤트가 발생됐을 때, 실행되는 함수이기 때문에) EXECUTION AND return 자바 스크립트는 single thread 기반의 언어, 즉 하나의 call stack…","html":"<h2 id=\"asynchronous-call-비동기-호출\"><a href=\"#asynchronous-call-%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%98%B8%EC%B6%9C\" aria-label=\"asynchronous call 비동기 호출 permalink\" class=\"anchor\"><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>Asynchronous call 비동기 호출</h2>\n<p>콜백 callback : 파라미터로 넘겨줘서 나중에 실행되는 함수.</p>\n<blockquote>\n<p>다른 코드의 인수argument로서 넘겨주는 function을 말한다.</p>\n</blockquote>\n<p>바로 실행되는 녀석이 아니다. ex) iterator(동기함수), event handler(비동기함수, 이벤트가 발생됐을 때, 실행되는 함수이기 때문에)</p>\n<h2 id=\"execution-and-return\"><a href=\"#execution-and-return\" aria-label=\"execution and return permalink\" class=\"anchor\"><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>EXECUTION AND return</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">otherCode</span><span class=\"token punctuation\">(</span>executableCode<span class=\"token punctuation\">)</span> <span class=\"token comment\">// 그저 함수를 넘겨주는 것이고</span>\n<span class=\"token function\">otehrCode</span><span class=\"token punctuation\">(</span><span class=\"token function\">executableCode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 함수를 실행시킨 리턴값을 넘겨줌.</span></code></pre></div>\n<p>자바 스크립트는 single thread 기반의 언어, 즉 하나의 call stack을 사용한다. 그렇다면 <strong>JavaScript는 어떻게 동시성을 지원하는가?</strong></p>\n<ul>\n<li>콜백 함수를 보관하는 공간(task queue)를 마련해놓고</li>\n<li>동기 작업이 모두 끝나 call stack이 비워지면(execution context가 전부 사라지면)</li>\n<li>(event loop에 의해) 콜백이 실행된다</li>\n</ul>\n<p>task를 하나 하나 적어보는 연습이 중요하다.</p>\n<p>EVENT-DRIVEN TASKS</p>\n<ul>\n<li>식당에서 식사하기</li>\n<li>메뉴를 확인한다.</li>\n<li>김밥을 주문한다.</li>\n<li>수저와 젓가락을 탁자에 올려놓는다.</li>\n<li>김치를 가져온다.</li>\n<li>식사를 먹는다.</li>\n<li>-</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">haveLunch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">-</span> <span class=\"token function\">checkMenu</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">-</span> <span class=\"token function\">order</span><span class=\"token punctuation\">(</span><span class=\"token string\">'김밥'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// &lt;- 이게 5분이 걸린다면? (return이 무의미해진다)</span>\n<span class=\"token operator\">-</span> <span class=\"token function\">putSpoon</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token operator\">-</span> <span class=\"token function\">bringKimchi</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token operator\">-</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>isReady<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">eat</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">haveLunch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">-</span> <span class=\"token function\">checkMenu</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">-</span> <span class=\"token function\">order</span><span class=\"token punctuation\">(</span><span class=\"token string\">'김밥'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// &lt;- order를 해놓고, 이게 ready 되면 먹자.</span>\n<span class=\"token operator\">-</span> <span class=\"token function\">putSpoon</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token operator\">-</span> <span class=\"token function\">bringKimchi</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token operator\">-</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>isReady<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">eat</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token operator\">-</span><span class=\"token operator\">></span> 간단하게\n<span class=\"token function\">order</span><span class=\"token punctuation\">(</span><span class=\"token string\">'김밥'</span><span class=\"token punctuation\">,</span> eat<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">//일단 실행하게 하고, 준비되면 (이벤트가 발생하면) 먹도록 하자</span>\n\n비동기는 비동기의 패턴으로 몰아넣는다<span class=\"token punctuation\">.</span></code></pre></div>\n<h2 id=\"settimeoutcallback-millisecond\"><a href=\"#settimeoutcallback-millisecond\" aria-label=\"settimeoutcallback millisecond permalink\" class=\"anchor\"><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>setTimeout(callback, millisecond)</h2>\n<p>일정 시간 후에 함수를 실행</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">setTImeout</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'3초 후에 실행'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3000</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// setTimeout에 대응되는 clearTimeout도 있으나 clearInterval를 더 많이 씀.</span></code></pre></div>\n<h2 id=\"clearintervaltimerid\"><a href=\"#clearintervaltimerid\" aria-label=\"clearintervaltimerid permalink\" class=\"anchor\"><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>clearInterval(timerId)</h2>\n<p>반복 실행중인 타이머를 종료</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> timer <span class=\"token operator\">=</span> <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'1초마다 실행'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">clearInterval</span><span class=\"token punctuation\">(</span>timer<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// 더 이상 반복 실행되지 않음</span></code></pre></div>\n<p>setTimeout 자체는 동기 함수이나, setTimeout 내부 구현은 비동기이기 때문에, chrome은 0초라는 게 없어서 실제로는 4밀리 세컨즈. task queue에 콜백 함수들이 넘어간다는게 중요.</p>\n<h2 id=\"asynchronous-use-cases\"><a href=\"#asynchronous-use-cases\" aria-label=\"asynchronous use cases permalink\" class=\"anchor\"><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>ASYNCHRONOUS USE CASES</h2>\n<ul>\n<li>event handler</li>\n<li>\n<p>타이머에서의 callback</p>\n<ul>\n<li>animation (DOM을 다루는 logic 등에서 씀.)</li>\n</ul>\n</li>\n<li>서버에 자원 요청 (가장 많이 쓰고 중요. Ajax call, db에 뭘 요청할 때)</li>\n</ul>\n<p>ASYNCHRONOUS 패턴을 자주 쓸 때, callback을 넘기는 패턴이 굉장히 중요.</p>","frontmatter":{"title":"Asynchronous call","date":"August 31, 2018"}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/til/20180831 Asynchronous call/","previous":{"fields":{"slug":"/til/20180828 poiemaweb.com 연산자/"},"frontmatter":{"title":"poiemaweb.com 연산자","category":"TIL"}},"next":{"fields":{"slug":"/til/20180901 poiemaweb 객체object와 변경불가성Immutability/"},"frontmatter":{"title":"poiemaweb 객체object와 변경불가성Immutability","category":"TIL"}}}}