íë¼ë¯¸ì¤ í¸ë¤ë¬ .then/catch/finallyë íì ë¹ë기ì ì¼ë¡ ì¤íë©ëë¤.
íë¼ë¯¸ì¤ê° ì¦ì ì´íëëë¼ë .then/catch/finally ìëì ìë ì½ëë ì´ í¸ë¤ë¬ë¤ì´ ì¤íë기 ì ì ì¤íë©ëë¤.
ìì:
let promise = Promise.resolve();
promise.then(() => alert("íë¼ë¯¸ì¤ ì±ê³µ!"));
alert("ì½ë ì¢
ë£"); // ì¼ë¿ ì°½ì´ ê°ì¥ 먼ì ë¹ëë¤.
ìì를 ì¤ííë©´ 'ì½ë ì¢ ë£âê° ë¨¼ì , 'íë¼ë¯¸ì¤ ì±ê³µ!'ì´ ëì¤ì ì¶ë ¥ëë ê²ì ë³¼ ì ììµëë¤.
íë¼ë¯¸ì¤ë ì¦ì ì´íìíê° ëìëë°ë ë§ì´ì£ . ëê° ì´ìíë¤ì.
ì .thenì´ ëì¤ì í¸ë¦¬ê±° ëììê¹ì? ê·¸ ì´ì ì ëí´ ììë´
ìë¤.
ë§ì´í¬ë¡íì¤í¬ í
ë¹ë기 ìì
ì ì²ë¦¬íë ¤ë©´ ì ì í ê´ë¦¬ê° íìí©ëë¤. ì´ë¥¼ ìí´ ECMAìì PromiseJobsë¼ë ë´ë¶ í(internal queue)를 ëª
ìí©ëë¤. V8 ìì§ìì ì´ë¥¼ 'ë§ì´í¬ë¡íì¤í¬ í(microtask queue)'ë¼ê³ ë¶ë¥´ê¸° ë문ì ì´ ì©ì´ê° ì¢ ë ì í¸ë©ëë¤.
ëª ì¸ìì ì¤ëª ì ì´í´ë´ ìë¤.
- ë§ì´í¬ë¡íì¤í¬ íë 먼ì ë¤ì´ì¨ ìì ì 먼ì ì¤íí©ëë¤(FIFO, first-in-first-out).
- ì¤íí ê²ì´ ì무ê²ë ë¨ììì§ ìì ëë§ ë§ì´í¬ë¡íì¤í¬ íì ìë ìì ì´ ì¤íë기 ììí©ëë¤.
ìì½íìë©´, ì´ë¤ íë¼ë¯¸ì¤ê° ì¤ë¹ëìì ë ì´ íë¼ë¯¸ì¤ì .then/catch/finally í¸ë¤ë¬ê° íì ë¤ì´ê°ë¤ê³ ìê°íìë©´ ë©ëë¤. ì´ë í¸ë¤ë¬ë¤ì ì¬ì í ì¤íëì§ ììµëë¤. íì¬ ì½ëìì ìì ë¡ì´ ìíê° ëìì ëììì¼ ìë°ì¤í¬ë¦½í¸ ìì§ì íìì ìì
ì êº¼ë´ ì¤íí©ëë¤.
ì ìììì 'ì½ë ì¢ ë£âê° ë¨¼ì ì¶ë ¥ëë ì´ì ê° ì¬ê¸°ì ììµëë¤.
íë¼ë¯¸ì¤ í¸ë¤ë¬ë íì ë´ë¶ í를 íµê³¼íê² ë©ëë¤.
ì¬ë¬ ê°ì .then/catch/finally를 ì¬ì©í´ ë§ë ì²´ì¸ì ê²½ì°, ê° í¸ë¤ë¬ë ë¹ë기ì ì¼ë¡ ì¤íë©ëë¤. íì ë¤ì´ê° í¸ë¤ë¬ ê°ê°ì íì¬ ì½ëê° ìë£ëê³ , íì ì ì²´ë ì´ì í¸ë¤ë¬ì ì¤íì´ ìë£ëìì ë ì¤íë©ëë¤.
ê·¸ë ë¤ë©´ 'íë¼ë¯¸ì¤ ì±ê³µ!'ì 먼ì , 'ì½ë ì¢ ë£â를 ëì¤ì ì¶ë ¥ëê² íë ¤ë©´ ì´ë»ê² í´ì¼ í ê¹ì? ì¤í ììê° ì¤ìí ê²½ì°ì ì´ë° ì구ì¬íì´ ì¶©ì¡±ëëë¡ ì½ë를 ìì±í´ì¼ í©ëë¤.
ë°©ë²ì ì주 ì½ìµëë¤. .thenì ì¬ì©í´ íì ë£ì¼ë©´ ë©ëë¤.
Promise.resolve()
.then(() => alert("íë¼ë¯¸ì¤ ì±ê³µ!"))
.then(() => alert("ì½ë ì¢
ë£"));
ì´ì ìëí ëë¡ ììê° ë³ê²½ëììµëë¤.
ì²ë¦¬ëì§ ëª»í ê±°ë¶
íë¼ë¯¸ì¤ì ìë¬ í¸ë¤ë§ìì íìµí unhandledrejection ì´ë²¤í¸ë¥¼ 기ìµíê³ ê³ìëì?
ì´ì ìë°ì¤í¬ë¦½í¸ ìì§ì´ ì´ë»ê² ì²ë¦¬ëì§ ëª»í ê±°ë¶(unhandled rejection)를 ì°¾ëì§ ì íí ì ì ììµëë¤.
'ì²ë¦¬ëì§ ëª»í ê±°ë¶âë ë§ì´í¬ë¡íì¤í¬ í ëìì íë¼ë¯¸ì¤ ìë¬ê° ì²ë¦¬ëì§ ëª»í ë ë°ìí©ëë¤.
ì ìì ì¸ ê²½ì°ë¼ë©´ ê°ë°ìë ìë¬ê° ì길 ê²ì ëë¹íì¬ íë¼ë¯¸ì¤ ì²´ì¸ì .catch를 ì¶ê°í´ ìë¬ë¥¼ ì²ë¦¬í©ëë¤.
let promise = Promise.reject(new Error("íë¼ë¯¸ì¤ ì¤í¨!"));
promise.catch(err => alert('ì¡ìë¤!'));
// ìë¬ê° ì ì²ë¦¬ëìì¼ë¯ë¡ ì¤íëì§ ììµëë¤.
window.addEventListener('unhandledrejection', event => alert(event.reason));
ê·¸ë°ë° .catch를 ì¶ê°í´ì£¼ë 걸 ìì ê²½ì°, ìì§ì ë§ì´í¬ë¡íì¤í¬ íê° ë¹ ì´íì unhandledrejection ì´ë²¤í¸ë¥¼ í¸ë¦¬ê±° í©ëë¤.
let promise = Promise.reject(new Error("íë¼ë¯¸ì¤ ì¤í¨!"));
// íë¼ë¯¸ì¤ ì¤í¨!
window.addEventListener('unhandledrejection', event => alert(event.reason));
ê·¸ë°ë° ë§ì½ ìëì ê°ì´ setTimeoutì ì´ì©í´ ìë¬ë¥¼ ëì¤ì ì²ë¦¬íë©´ ì´ë¤ ì¼ì´ ì길ê¹ì?
let promise = Promise.reject(new Error("íë¼ë¯¸ì¤ ì¤í¨!"));
setTimeout(() => promise.catch(err => alert('ì¡ìë¤!')), 1000);
// Error: íë¼ë¯¸ì¤ ì¤í¨!
window.addEventListener('unhandledrejection', event => alert(event.reason));
ìì를 ì¤ííë©´ íë¼ë¯¸ì¤ ì¤í¨!ê° ë¨¼ì , ì¡ìë¤!ê° ëì¤ì ì¶ë ¥ëë 걸 íì¸í ì ììµëë¤.
ë§ì´í¬ë¡íì¤í¬ íì ëí´ ëª°ëë¤ë©´ "ìë¬ë¥¼ ì¡ìëë°ë ì unhandledrejection í¸ë¤ë¬ê° ì¤íëë ê±°ì§?"ë¼ë ì문ì ê°ì¡ì ê²ëë¤.
unhandledrejectionì ë§ì´í¬ë¡íì¤í¬ íì ìë ìì
모ëê° ìë£ëìì ë ìì±ë©ëë¤. ìì§ì íë¼ë¯¸ì¤ë¤ì ê²ì¬íê³ ì´ ì¤ íëë¼ë âê±°ë¶(rejected)â ìíì´ë©´ unhandledrejection í¸ë¤ë¬ë¥¼ í¸ë¦¬ê±° íì£ . ì´ë¡ì¨ ìì ìë¬¸ì´ ìì°ì¤ë í´ê²°ëììµëë¤.
ì ìì를 ì¤ííë©´ setTimeoutì ì¬ì©í´ ì¶ê°í .catch ìì í¸ë¦¬ê±° ë©ëë¤. ë¤ë§ .catchë unhandledrejectionì´ ë°ìí ì´íì í¸ë¦¬ê±° ëë¯ë¡ íë¼ë¯¸ì¤ ì¤í¨!ê° ì¶ë ¥ë©ëë¤.
ìì½
모ë íë¼ë¯¸ì¤ ëìì âë§ì´í¬ë¡íì¤í¬ íâ(ES8 ì©ì´)ë¼ ë¶ë¦¬ë ë´ë¶ âíë¼ë¯¸ì¤ ì¡(promise job)â íì ë¤ì´ê°ì ì²ë¦¬ë기 ë문ì íë¼ë¯¸ì¤ í¸ë¤ë§ì íì ë¹ëê¸°ë¡ ì²ë¦¬ë©ëë¤.
ë°ë¼ì .then/catch/finally í¸ë¤ë¬ë íì íì¬ ì½ëê° ì¢
ë£ëê³ ë íì í¸ì¶ë©ëë¤.
ì´ë¤ ì½ë ì¡°ê°ì .then/catch/finallyê° í¸ì¶ë ì´íì ì¤ííê³ ì¶ë¤ë©´ .thenì ì²´ì¸ì ì¶ê°íê³ ì´ ìì ì½ë ì¡°ê°ì ë£ì¼ë©´ ë©ëë¤.
ë¸ë¼ì°ì ì Node.js를 í¬í¨í ëë¶ë¶ì ìë°ì¤í¬ë¦½í¸ ìì§ìì ë§ì´í¬ë¡íì¤í¬ê° 'ì´ë²¤í¸ 루í(event loop)'ì '매í¬ë¡íì¤í¬(macrotask)'ì ê¹ì ì°ê´ ê´ê³ë¥¼ 맺ìµëë¤. ì´ ëì íë¼ë¯¸ì¤ìë ì§ì ì ì¸ ì°ê´ì±ì´ ì기 ë문ì, ì´ë²¤í¸ 루íì 매í¬ë¡íì¤í¬, ë§ì´í¬ë¡íì¤í¬ìì ë°ë¡ ë¤ë£¨ëë¡ íê² ìµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.