Promise ãã³ãã© .then/.catch/.finally ã¯å¸¸ã«éåæã§ãã
ãã¨ã Promise ãããã«è§£æ±ºãããã¨ãã¦ãã.then/.catch/.finally ã® ä¸ ã«ããã³ã¼ãã¯ãããã®ãã³ãã©ã®åã«å®è¡ããã¾ãã
ãã¢ã§ã:
let promise = Promise.resolve();
promise.then(() => alert("promise done!"));
alert("code finished"); // ãã®ã¢ã©ã¼ããæåã«è¡¨ç¤ºããã¾ã
å®è¡ããã¨ãcode finished ãæåã«ç¾ãããã®å¾ promise done! ã表示ããã¾ãã
Promise ã¯æåãã確å®ã«çµãã£ã¦ããã®ã§ãããã¯å¥å¦ã§ãã
ãªã .then ãå¾ã§ããªã¬ã¼ãããã®ã§ãããï¼ä½ãããã¦ããã®ã§ãããï¼
Microtasks ãã¥ã¼
éåæã¿ã¹ã¯ã«ã¯é©åãªç®¡çãå¿
è¦ã§ãããã®ããã«ãECMA æ¨æºã§ã¯å
é¨ãã¥ã¼ PromiseJobs ã«ã¤ãã¦è¿°ã¹ã¦ãã¾ãããã㯠âmicrotask ãã¥ã¼â(v8 ç¨èª)ã¨å¼ã°ãããã¨ãå¤ãã§ãã
ã¹ããã¯ã§ã¯æ¬¡ã®ããã«è¿°ã¹ããã¦ãã¾ã:
- ãã¥ã¼ã¯å å ¥ãå åºã(first-in-first-out)ã§ã: å ã«ãã¥ã¼ã«å ¥ããããã¿ã¹ã¯ãæåã«å®è¡ããã¾ãã
- ã¿ã¹ã¯ã®å®è¡ã¯ä»ã«ãªã«ãå®è¡ããã¦ããªãã¨ãã«ã ãéå§ããã¾ãã
ç°¡åã«è¨ãã¨ãPromise ãæºåã§ããã¨ããã® .then/catch/finally ãã³ãã©ã¯ãã¥ã¼ã«å
¥ãããã¾ãããããã¯ã¾ã å®è¡ããã¦ãã¾ãããJavaScriptã¨ã³ã¸ã³ã¯ãç¾å¨ã®ã³ã¼ãããªãã¨ãã«ãã¥ã¼ããã¿ã¹ã¯ãåããå®è¡ãã¾ãã
ãªã®ã§ãä¸ã®ä¾ã§ã¯å ã« âcode finishedâ ã表示ããã¾ããã
Promise ãã³ãã©ã¯å¸¸ã«å é¨ãã¥ã¼ãéãã¾ãã
è¤æ°ã® .then/catch/finally ã®ãã§ã¼ã³ãããå ´åããããã¯ãã¹ã¦éåæã«å®è¡ããã¾ããã¤ã¾ããæåã«ãã¥ã¼ã«å
¥ããããç¾å¨ã®ã³ã¼ããå®äºããåã«ãã¥ã¼ã«å
¥ãããããã³ãã©ãçµäºããã¨ãã«å®è¡ããã¾ãã
é åºãéè¦ãªå ´åã¯ã©ããªãã§ããããï¼ promise done ã®å¾ã« code finished ãå¦çãããå ´åã¯ã©ãããã°ããã§ãããï¼
ç°¡åã§ããåã« .then ã§ãã¥ã¼ã«å
¥ããã ãã§ã:
Promise.resolve()
.then(() => alert("promise done!"))
.then(() => alert("code finished"));
ããã§é çªã¯æå¾ éãã§ãã
æªå¦çã®æå¦(Unhandled rejection)
Promise ã§ã®ã¨ã©ã¼ãã³ããªã³ã° ã®ç« ã® unhandledrejection ã¤ãã³ããè¦ãã¦ãã¾ããï¼
ä»ããæã 㯠JavaScript ãæªå¦çã®æå¦ããã£ããã¨ãã©ã®ããã«è¦ã¤ããã®ããæ£ç¢ºã«ç¥ããã¨ãã§ãã¾ãã
âæªå¦çã®æå¦â ã¯ãmicrotask ãã¥ã¼ã®æå¾ã§ Promise ã¨ã©ã¼ãå¦çãããªãå ´åã«çºçãã¾ãã
é常ãã¨ã©ã¼ãäºæ³ãããå ´åã«ã¯ããããå¦çããããã« Promise ãã§ã¼ã³ã« .catch ã追å ãã¾ã:
let promise = Promise.reject(new Error("Promise Failed!"));
promise.catch(err => alert('caught'));
// å®è¡ããã¾ãã: error handled
window.addEventListener('unhandledrejection', event => alert(event.reason));
â¦ã§ããã.catch ãå¿ãã¦ããå ´åãmicrotask ãã¥ã¼ã空ã«ãªã£ãå¾ãã¨ã³ã¸ã³ã¯ã¤ãã³ããããªã¬ã¼ãã¾ã:
let promise = Promise.reject(new Error("Promise Failed!"));
// å®è¡ããã¾ã: Promise Failed!
window.addEventListener('unhandledrejection', event => alert(event.reason));
ä»®ã«ã次ã®ããã«å¾ã§ã¨ã©ã¼ãå¦çããã¨ã©ããªãã§ãããï¼:
let promise = Promise.reject(new Error("Promise Failed!"));
setTimeout(() => promise.catch(err => alert('caught')), 1000);
// å®è¡ããã¾ã: Error: Promise Failed!
window.addEventListener('unhandledrejection', event => alert(event.reason));
å®è¡ããã¨ãæåã« Promise Failed! ã表示ããããã®å¾ caught ã表示ããã¾ãã
microtask ãã¥ã¼ã«ã¤ãã¦ç¥ããªããã°ã䏿è°ã«æãã§ããã: âãªã unhandledrejection ãã³ãã©ãå®è¡ãããã®ã§ãããï¼ ã¨ã©ã¼ããã£ãããã¦ããã®ã«!â
ããããä»ã¯ unhandledrejection 㯠microtask ãã¥ã¼ãå®äºããã¨ãã«çæããããã¨ãåããã¾ããã: ã¨ã³ã¸ã³ã¯ Promise ãæ¤æ»ããããããã âæå¦(rejected)â ç¶æ
ã§ããã°ãã¤ãã³ããããªã¬ã¼ãã¾ãã
ä¸è¨ã®ä¾ã§ã¯ãsetTimeout ã«ãã追å ããã .catch ãããªã¬ã¼ããã¾ãããunhandledrejection ã¯ãã§ã«çºçããå¾ãªã®ã§ãä½ãå¤ããã¾ããã
ãµããª
ãã¹ã¦ã® Promise ã¢ã¯ã·ã§ã³ã¯ãâmicrotask ãã¥ã¼â(v8 ç¨èª)ã¨ãå¼ã°ãããå é¨ã® âpromise jobsâ ãã¥ã¼ãéããããPromise ã®å¦çã¯å¸¸ã«éåæã§ãã
ãã®ããã.then/catch/finally ãã³ãã©ã¯å¸¸ã«ç¾å¨ã®ã³ã¼ããçµäºããå¾ã«å¼ã°ãã¾ãã
ããã³ã¼ãã .then/catch/finally ã®å¾ã«å®è¡ããããã¨ãä¿è¨¼ããå¿
è¦ãããå ´åãPromise ãã§ã¼ã³ã使ã .then ã§å¼ã³åºãã¾ã
ãã©ã¦ã¶ã Node.js ãå«ãã»ã¨ãã©ã® JavaScript ã¨ã³ã¸ã³ã§ã¯ãmicrotask ã®æ¦å¿µã¯ âã¤ãã³ãã«ã¼ãâ 㨠âmicrotaskâ ã¨å¯æ¥ã«é¢é£ãã¦ãã¾ããããã㯠Promise ã¨ã¯ç´æ¥ã¯é¢ä¿ãªãã®ã§ããã¥ã¼ããªã¢ã«ã®å¥ã®ãã¼ãããã£ãã¿ã¼ ã¤ãã³ãã«ã¼ã(event loop): microtask 㨠macrotask ã§èª¬æãã¦ãã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã