[ã¢ããã€ã¹ãèªã]ãµã€ã¯ã«ã®ä»ã®19ã®éšå JavaScriptã®å
éšæ©èœã«ç¹åããäžé£ã®è³æã®4çªç®ã®éšåãæ¬¡ã«ç€ºããŸãã ãããã®è³æã¯ãäžæ¹ã§ã¯JSèšèªããã³ãšã³ã·ã¹ãã ã®åºæ¬èŠçŽ ãç ç©¶ããããšãç®çãšããŠãããããäžæ¹ã§ã¯
SessionStackã§ã®ãœãããŠã§ã¢éçºã®å®è·µã«åºã¥ããæšå¥šäºé
ãå«ãã§ããŸãã ç«¶äºåã®ããJSã¢ããªã±ãŒã·ã§ã³ã¯ãé«éã§ä¿¡é Œæ§ãé«ããªããã°ãªããŸããã ãã®ãããªã¢ããªã±ãŒã·ã§ã³ã®äœæã¯ãæçµçã«ãJavaScriptã¡ã«ããºã ã«èå³ããã人ãéæããããšããç®æšã§ãã

ãã®èšäºã¯ã
æåã®è³æã®éçºãšã¿ãªãããšãã§ããŸãã ããã§ã¯ãã·ã³ã°ã«ã¹ã¬ããå®è¡ã¢ãã«ã®å¶éãæ€èšãããããã®å¶éãå
æããæ¹æ³ã«ã€ããŠèª¬æããŸãã ããšãã°ãJSã§é«å質ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãéçºããå Žåã ãã€ãã®ããã«ãææã®æåŸã«ãèæ
®ãããæè¡ã®äœ¿çšã«é¢ããå®çšçãªæšå¥šäºé
ãäžããããŸãã ãã®èšäºã®äž»ãªãããã¯ã¯éåæéçºãªã®ã§ããããã¯
async / await
ã䜿çšããŠã³ãŒããæ¹åããããã®5ã€ã®ãã³ãã§ãã
ã·ã³ã°ã«ã¹ã¬ããã³ãŒãå®è¡ã¢ãã«ã®å¶é
æåã®èšäºã§ã¯ããã³ãŒã«ã¹ã¿ãã¯ã«å®äºãŸã§ã«é·ãæéãããã颿°ããããšã©ããªããŸããïŒããšãã質åã«ã€ããŠèããŸããã ãããã®èå¯ãç¶ããŸãã
ãã©ãŠã¶ã§å®è¡ãããè€éãªç»ååŠçã¢ã«ãŽãªãºã ãæ³åããŠãã ããã åŒã³åºãã¹ã¿ãã¯ã«æ©èœãã颿°ãããå Žåããã©ãŠã¶ã¯ä»ã«äœãã§ããŸããã 圌ã¯ãããã¯ãããŠããŸãã ã€ãŸãããã©ãŠã¶ã¯ç»é¢ã«äœã衚瀺ã§ãããä»ã®ã³ãŒããå®è¡ã§ããŸããã ãã®ç¶æ³ã®æãé¡èãªçµæã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®ããã¬ãŒããã§ãã WebããŒãžã¯åã«ããžã£ãã³ã°ããããŠããŸãã
å Žåã«ãã£ãŠã¯ãããã¯ããã»ã©æ·±å»ãªåé¡ã§ã¯ãªããããããŸããã ãã ããããã¯ææªã§ã¯ãããŸããã ãã©ãŠã¶ãããŸãã«ãå€ãã®ã¿ã¹ã¯ãå®è¡ãå§ãããšããã«ããŠãŒã¶ãŒã®åœ±é¿ã«é·æéå¿çããªãå ŽåããããŸãã éåžžããã®ãããªç¶æ³ã§ã¯ããã©ãŠã¶ãŒã¯ä¿è·å¯Ÿçãè¬ããŠãšã©ãŒã¡ãã»ãŒãžã衚瀺ããåé¡ã®ããŒãžãéãããã©ããããŠãŒã¶ãŒã«å°ããŸãã ãŠãŒã¶ãŒããã®ãããªã¡ãã»ãŒãžãèŠãªãæ¹ãè¯ãã§ãããã ãããã¯ãçŸãã䟿å©ãªã€ã³ã¿ãŒãã§ãŒã¹ãäœæããéçºè
ã®ãã¹ãŠã®åªåãå®å
šã«å°ç¡ãã«ããŸãã

ããããWebã¢ããªã±ãŒã·ã§ã³ã®å€èгãçŸããããè€éãªèšç®ãå®è¡ã§ããããã«ããã«ã¯ã©ãããã°ããã§ããããïŒ JSã¢ããªã±ãŒã·ã§ã³ã®æ§æèŠçŽ ãåæããããšã«ããããã®è³ªåã«å¯Ÿããçããæ¢ãå§ããŸãã
JavaScriptã®æ§æèŠçŽ
JavaScriptã¢ããªã±ãŒã·ã§ã³ã³ãŒãã¯åäžã®.jsãã¡ã€ã«ã«é
眮ã§ããŸãããã»ãŒç¢ºå®ã«è€æ°ã®ãããã¯ã§æ§æãããŸãã ãã®å Žåããããã®ãããã¯ã®ãã¡ã®1ã€ã ããç¹å®ã®æç¹ã§å®è¡ãããŸãã æ®ãã¯åŸã§å®è¡ãããŸãã JavaScriptã®æãäžè¬çãªã³ãŒããããã¯ã¯é¢æ°ã§ãã
ã©ããããã»ãšãã©ã®æ°ããJSéçºè
ã¯ããåŸã§ãããããã«ãããã«ç¶ããšã¯éããªããšããäºå®ãå®å
šã«ã¯èªèããŠããŸããã ã€ãŸãããä»ãå®äºã§ããªãã¿ã¹ã¯ã¯éåæã§å®è¡ããå¿
èŠããããŸãã ããã¯ãããããç¥ããªããã¡ã«ãããªããäºæããŠããã¯ãã®ãããã¯åäœã«é¥ããªãããšãæå³ããŸãã
次ã®äŸãèŠãŠãã ããã
// ajax(..) - Ajax- var response = ajax('https://example.com/api'); console.log(response); // response api
æšæºã®Ajaxãªã¯ãšã¹ããåæçã«å®è¡ãããªãããšããåç¥ãããããŸããã ã€ãŸããåŒã³åºãçŽåŸã®
ajax(..)
颿°ã¯ã
response
倿°ã«å²ãåœãŠãããšãã§ããå€ãè¿ãããšãã§ããŸããã
éåæé¢æ°ã«ãã£ãŠè¿ãããçµæã®ãæåŸ
ããæŽçããããã®åçŽãªã¡ã«ããºã ã¯ãããããã³ãŒã«ããã¯é¢æ°ããŸãã¯ã³ãŒã«ããã¯ã䜿çšããããšã§ãã
ajax('https://example.com/api', function(response) { console.log(response)
ããã§ãAjaxãªã¯ãšã¹ããåæçã«å®è¡ã§ããããšã«æ³šæããŠãã ããã ãã ããããã¯è¡ããªãã§ãã ããã åæAjaxãªã¯ãšã¹ããå®è¡ãããšãJSã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ããããã¯ãããŸãã ãŠãŒã¶ãŒã¯ãã¿ã³ãã¯ãªãã¯ãããããã£ãŒã«ãã«ããŒã¿ãå
¥åããããããŒãžãã¹ã¯ããŒã«ããããšããã§ããªããªããŸãã Ajaxãªã¯ãšã¹ãã®åæå®è¡ã«ããããŠãŒã¶ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãšå¯Ÿè©±ã§ããªããªããŸãã ãã®ã¢ãããŒãã¯ãå¯èœã§ãããæ²æšãªçµæã«ã€ãªãããŸãã
ããããã®ææã®æ§åã§ãããã ãããã®ãããªããšã¯çµ¶å¯Ÿã«æžããªãã§ãã ãããWebãéåžžã®åäœãäžå¯èœãªå Žæã«å€ããªãã§ãã ããã
// , jQuery jQuery.ajax({ url: 'https://api.example.com/endpoint', success: function(response) { // - . }, async: false // - , });
ããã§ã¯Ajaxãªã¯ãšã¹ãã®äŸã瀺ããŸããããã©ã®ã³ãŒãã§ãéåæã¢ãŒãã§å®è¡ã§ããŸãã
ããšãã°ã
setTimeout(callback, milliseconds)
颿°ã䜿çšããŠãããè¡ãããšãã§ããŸãã ãã®é¢æ°ã«ã¢ã¯ã»ã¹ããç¬éããåŸã«çºçããã€ãã³ãã®å®è¡ãã¹ã±ãžã¥ãŒã«ããããšãã§ããŸãïŒã¿ã€ã ã¢ãŠããèšå®ããããšã«ããïŒã äŸãèããŠã¿ãŸãããïŒ
function first() { console.log('first'); } function second() { console.log('second'); } function third() { console.log('third'); } first(); setTimeout(second, 1000);
ãã®ã³ãŒããã³ã³ãœãŒã«ã«åºåããå
å®¹ã¯æ¬¡ã®ãšããã§ãã
first third second
ã€ãã³ãã«ãŒãç ç©¶
ããã¯å¥åŠã«æãããããããŸããããES6 JavaScriptããåã§ã¯ãéåæåŒã³åºãïŒäžèšã®
setTimeout
ãªã©ïŒãè¡ãããšãã§ããŸããããçµã¿èŸŒã¿ã®éåæããã°ã©ãã³ã°ã¡ã«ããºã ã¯å«ãŸããŠããŸããã§ããã JSãšã³ãžã³ã¯ãç¹å®ã®ã³ãŒããã©ã°ã¡ã³ããäžåºŠã«1ã€ãã€ã·ã³ã°ã«ã¹ã¬ããã§å®è¡ããã ãã§ããã
JavaScriptãšã³ãžã³ïŒç¹ã«V8ïŒã®ä»çµã¿ã«ã€ããŠè©³ããã¯ã
ãã®è³æãã芧ãã ããã
ããã§ã¯ãããã°ã©ã ã®äžéšãå®è¡ããå¿
èŠãããããšãJSãšã³ãžã³ã«èª°ãäŒããã®ã§ããããïŒ å®éã«ã¯ããšã³ãžã³ã¯åç¬ã§ã¯åäœããŸãããç¬èªã®ã³ãŒãã¯ç¹å®ã®ç°å¢å
ã§å®è¡ãããŸããã»ãšãã©ã®éçºè
ã«ãšã£ãŠã¯ããã©ãŠã¶ãŒãŸãã¯Node.jsã§ãã å®éã仿¥ã§ã¯ããããããã¹ããŒãé»çãŸã§ãããŸããŸãªçš®é¡ã®ããã€ã¹çšã®JSãšã³ãžã³ããããŸãã ãã®ãããªåããã€ã¹ã¯ãJSãšã³ãžã³ã®ç°å¢ã®ç¬èªã®ããŒãžã§ã³ã衚ããŸãã
ãã®ãããªç°å¢ãã¹ãŠã«å
±éããç¹æ§ã¯ãã€ãã³ãã«ãŒããšåŒã°ããçµã¿èŸŒã¿ã¡ã«ããºã ã§ãã ããã°ã©ã ãã©ã°ã¡ã³ãã®å®è¡ããµããŒããããã®ããã«JSãšã³ãžã³ãåŒã³åºããŸãã
ã€ãŸãããšã³ãžã³ã¯ããªã³ããã³ãã§åŒã³åºãããJSã³ãŒãã®ã©ã³ã¿ã€ã ãšèŠãªãããšãã§ããŸãã ãŸããã€ãã³ããã©ã³ãã³ã°ïŒã€ãŸããJSã³ãŒãå®è¡ã»ãã·ã§ã³ïŒã¯ããšã³ãžã³å€éšã®ç°å¢ã¡ã«ããºã ã«ãã£ãŠåŠçãããŸãã
ãããã£ãŠãããšãã°ãããã°ã©ã ãAjaxãªã¯ãšã¹ããå®è¡ããŠãµãŒããŒããããŒã¿ãããŠã³ããŒãããå Žåãã³ãŒã«ããã¯å
ã®
response
倿°ã«ãã®ããŒã¿ãæžã蟌ãã³ãã³ããæžããšãJSãšã³ãžã³ã¯ç°å¢ã«æ¬¡ã®ããã«äŒããŸãããã®ãããã¯ãŒã¯èŠæ±ã®å®è¡ãå®äºããŠããŒã¿ãåä¿¡ãããããã®ã³ãŒã«ããã¯ãåŒã³åºããŠãã ããã
次ã«ããã©ãŠã¶ãŒã¯ããããã¯ãŒã¯ãµãŒãã¹ããã®å¿çãåŸ
æ©ããŠãããªã¹ããŒãèšå®ããèŠæ±ãå®è¡ããããã°ã©ã ã«è¿ãããšãã§ãããã®ãããå Žåãã³ãŒã«ããã¯ãåŒã³åºããŠã€ãã³ãã«ãŒãã«è¿œå ããããšãèšç»ããŸãã
次ã®å³ãã芧ãã ããã

ããŒãïŒã¡ã¢ãªããŒãïŒããã³ã³ãŒã«ã¹ã¿ãã¯ïŒã³ãŒã«ã¹ã¿ãã¯ïŒã®è©³çްã«ã€ããŠã¯ã
ãã¡ããã芧ãã ãã ã Web APIãšã¯äœã§ããïŒ äžè¬ã«ããããã¯çŽæ¥ã¢ã¯ã»ã¹ã§ããªããããŒã§ãããåŒã³åºãã®ã¿ãå®è¡ã§ããŸãã ãããã¯ãã©ãŠã¶ã«çµã¿èŸŒãŸããéåæã¢ã¯ã·ã§ã³ãå®è¡ãããŸãã
Node.jsçšã«éçºããŠããå ŽåãC ++ã䜿çšããŠåæ§ã®APIãå®è£
ãããŸãã
ã§ã¯ãã€ãã³ãã«ãŒããšã¯äœã§ããïŒ
ã€ãã³ãã«ãŒãã¯ã1ã€ã®äž»ãªåé¡ã解決ããŸããã³ãŒã«ã¹ã¿ãã¯ãšã³ãŒã«ããã¯ãã¥ãŒãç£èŠããŸãã åŒã³åºãã¹ã¿ãã¯ã空ã®å Žåãã«ãŒãã¯ãã¥ãŒããæåã®ã€ãã³ããååŸããŠã¹ã¿ãã¯ã«é
眮ããŸããããã«ããããã®ã€ãã³ããå®è¡ãããŸãã
ãã®å埩ã¯ãã€ãã³ãã«ãŒãã®ãã£ãã¯ãšåŒã°ããŸãã åã€ãã³ãã¯åãªãã³ãŒã«ããã¯ã§ãã
次ã®äŸãèããŠã¿ãŸãããã
console.log('Hi'); setTimeout(function cb1() { console.log('cb1'); }, 5000); console.log('Bye');
ãã®ã³ãŒããæ®µéçã«ãå®è¡ãããŠãã·ã¹ãã ã§äœãèµ·ããããèŠãŠã¿ãŸãããã
1.ãŸã äœãèµ·ããŠããŸããã ãã©ãŠã¶ã³ã³ãœãŒã«ã¯ã¯ãªãŒã³ã§ãåŒã³åºãã¹ã¿ãã¯ã¯ç©ºã§ãã

2.
console.log('Hi')
ã³ãã³ããåŒã³åºãã¹ã¿ãã¯ã«è¿œå ãããŸãã

3.
console.log('Hi')
ã³ãã³ããå®è¡ãããŸãã

4.
console.log('Hi')
ã³ãã³ãã¯åŒã³åºãã¹ã¿ãã¯ããåé€ãããŸãã

5.
setTimeout(function cb1() { ... })
ã³ãã³ããã³ãŒã«ã¹ã¿ãã¯ã«è¿œå ãããŸãã

6.
setTimeout(function cb1() { ... })
ã³ãã³ããå®è¡ãããŸãã ãã©ãŠã¶ã¯ãWeb APIã®äžéšã§ããã¿ã€ããŒãäœæããŸãã 圌ã¯ã«ãŠã³ãããŠã³ãè¡ããŸãã

7.
setTimeout(function cb1() { ... })
ã³ãã³ããå®äºããã³ãŒã«ã¹ã¿ãã¯ããåé€ãããŸããã

8.
console.log('Bye')
ã³ãã³ããåŒã³åºãã¹ã¿ãã¯ã«è¿œå ãããŸãã

9.
console.log('Bye')
ã³ãã³ããå®è¡ãããŸãã

10.
console.log('Bye')
ã³ãã³ãã¯åŒã³åºãã¹ã¿ãã¯ããåé€ãããŸãã

11.å°ãªããšã5000ããªç§ã
cb1
ãšãã¿ã€ããŒãçµäºããcb1
cb1
ãã³ãŒã«ããã¯ãã¥ãŒã«é
眮ãããŸãã

12.ã€ãã³ãã«ãŒãã¯ã
cb1
ãã¥ãŒãã
cb1
颿°ã
cb1
ããã³ãŒã«ã¹ã¿ãã¯ã«é
眮ããŸãã

13.
cb1
颿°
cb1
å®è¡ããã
console.log('cb1')
ãåŒã³åºãã¹ã¿ãã¯ã«è¿œå ãããŸãã

14.
console.log('cb1')
ã³ãã³ã
console.log('cb1')
ãå®è¡ãããŸãã

15.
console.log('cb1')
ã³ãã³ã
console.log('cb1')
ã¯åŒã³åºãã¹ã¿ãã¯ããåé€ãããŸãã

16.
cb1
颿°ã¯åŒã³åºãã¹ã¿ãã¯ããåé€ãããŸãã

ããã§ã¯ãä¿®æ£ã®ããã«ãã¢ãã¡ãŒã·ã§ã³åœ¢åŒã§åãã

ES6仿§ã§ã¯ãã€ãã³ãã«ãŒãã®åäœæ¹æ³ãå®çŸ©ãããŠããããšã«æ³šæããŠãã ãããã€ãŸããæè¡çã«ã¯JSãšã³ã·ã¹ãã ã§ããéèŠãªåœ¹å²ãæããå§ããJSãšã³ãžã³ã®è²¬ä»»å
ã«ããããšã瀺ããŠããŸãã ããã®äž»ãªçç±ã¯ãçŽæãES6ã«ç»å Žããã€ãã³ãã«ãŒããã¥ãŒã§æäœãã¹ã±ãžã¥ãŒã«ããããã®ä¿¡é Œã§ããã¡ã«ããºã ãå¿
èŠã ããã§ãã
setTimeoutïŒ...ïŒã®ä»çµã¿
setTimeout(âŠ)
åŒã³åºããŠããã³ãŒã«ããã¯ã¯ã€ãã³ãã«ãŒããã¥ãŒã«èªåçã«é
眮ãããŸããã ãã®ã³ãã³ãã¯ã¿ã€ããŒãéå§ããŸãã ã¿ã€ããŒãããªã¬ãŒããããšãç°å¢ã¯ã³ãŒã«ããã¯ãã€ãã³ãã«ãŒãã«å
¥ããŸãããã®çµæãå°æ¥ã®ãã£ãã¯ã®äžéšã§ããã®ã³ãŒã«ããã¯ãæ©èœããŠå®è¡ãããŸãã ãã®ã³ãŒãã¹ãããããã芧ãã ããã
setTimeout(myCallback, 1000)
ãã®ã³ãã³ãã®å®è¡ã¯ã
myCallback
ã1000ããªç§åŸã«å®è¡ãããããšãæå³ãããã®ã§ã¯ãããŸããã1000ããªç§åŸã«èšã£ãæ¹ãæ£ç¢ºã§ãã
myCallback
ããã¥ãŒã«è¿œå ãããŸãã ãã ãããã¥ãŒã«ã¯ä»ã®ã€ãã³ãã以åã«è¿œå ãããŠããå¯èœæ§ããããããã³ãŒã«ããã¯ã¯åŸ
æ©ããå¿
èŠããããŸãã
JavaScriptã§éåæããã°ã©ãã³ã°ãå§ããã°ããã®äººåãã®èšäºãããªããããŸãã ãããã®äžã§
setTimeout(callback, 0)
ã³ãã³ãã䜿çšããããã®æšå¥šäºé
ãèŠã€ããããšãã§ããŸãã ããã§ãã€ãã³ãã«ãŒãã®ä»çµã¿ãš
setTimeout
ãåŒã³åºãããšãã®åäœãããããŸããã ãããèãããšã2çªç®ã®åŒæ°0ãæå®ããŠ
setTimeout
ãåŒã³åºããšãã³ãŒã«ã¹ã¿ãã¯ãã¯ãªã¢ããããŸã§ã³ãŒã«ããã¯åŒã³åºããåã«å»¶æãããããšã¯æããã§ãã
次ã®äŸãèŠãŠãã ããã
console.log('Hi'); setTimeout(function() { console.log('callback'); }, 0); console.log('Bye');
ã¿ã€ããŒãèšå®ãããæéã¯0ããªç§ã§ãããã³ã³ãœãŒã«ã«ã¯æ¬¡ã®ããã«è¡šç€ºãããŸãã
Hi Bye callback
ES6ã¯ãšã¹ã
ES6ã§ã¯ããžã§ããã¥ãŒãšåŒã°ããæ°ããã³ã³ã»ãããå°å
¥ãããŠããŸãã ãã®èšèšã¯ãã€ãã³ãã«ãŒããã¥ãŒã®æäžäœã«ããã¬ã€ã€ãŒãšèŠãªãããšãã§ããŸãã promiseã®éåæåäœã®ç¹æ§ã«å¯ŸåŠããå¿
èŠããããšãã«ããã®åé¡ã«ééããå¯èœæ§ã¯ååã«ãããŸãã
ãããäžèšã§èª¬æããŸãããã®çµæãPromiseã䜿çšããéåæéçºã«ã€ããŠè©±ããšããéåæã¢ã¯ã·ã§ã³ãã©ã®ããã«èšç»ããã³åŠçãããããçè§£ã§ããŸãã
ãããæ³åããŠãã ããããžã§ããã¥ãŒã¯ãã€ãã³ãã«ãŒããã¥ãŒã®åãã£ãã¯ã®çµããã«æ¥ç¶ããããã¥ãŒã§ãã ã€ãã³ãã«ãŒãã®ãã£ãã¯äžã«çºçããå¯èœæ§ã®ããäžéšã®éåæã¢ã¯ã·ã§ã³ã¯ãæ°ããã€ãã³ããã€ãã³ãã«ãŒããã¥ãŒã«è¿œå ããŸãããã代ããã«èŠçŽ ïŒã€ãŸããã¿ã¹ã¯ïŒãçŸåšã®ãã£ãã¯ã®ã¿ã¹ã¯ãã¥ãŒã®æåŸã«è¿œå ãããŸãã ããã¯ãå°æ¥å®è¡ãããã³ãã³ãããã¥ãŒã«è¿œå ããããšã«ãããå®è¡ãããé åºã確èªã§ããããšãæå³ããŸãã
ã¿ã¹ã¯ãå®äºãããšãåããã¥ãŒã®æåŸã«ã¿ã¹ã¯ã远å ã§ããŸãã çè«çã«ã¯ãã埪ç°ãã¿ã¹ã¯ïŒä»ã®ã¿ã¹ã¯ã®è¿œå ã«é¢äžããã¿ã¹ã¯ïŒãç¡éã«åäœããã€ãã³ããµã€ã¯ã«ã®æ¬¡ã®ãã£ãã¯ã«ç§»åããããã«å¿
èŠãªããã°ã©ã ãªãœãŒã¹ã䜿ãæããå¯èœæ§ããããŸãã æŠå¿µçã«ã¯ãããã¯
while(true)
ãããªç¡éã«ãŒããäœæãããããªãã®ã§ãã
ã¿ã¹ã¯ã¯ããhackãs
etTimeout(callback, 0)
ãããªãã®ã§ãããåŸã§å®è¡ããããã§ããã ãæ©ãå®è¡ãããäžé£ã®æäœã远跡ã§ããããã«å®è£
ãããŠããŸãã
ã³ãŒã«ããã¯
æ¢ã«ãåãã®ãšãããã³ãŒã«ããã¯ã¯ãJavaScriptããã°ã©ã ã§éåæã¢ã¯ã·ã§ã³ã衚çŸããã³å®è¡ããæãäžè¬çãªææ®µã§ãã ããã«ãã³ãŒã«ããã¯ã¯æãåºæ¬çãªéåæèšèªãã³ãã¬ãŒãã§ãã æ°ãåããªãã»ã©ã®JSã¢ããªã±ãŒã·ã§ã³ã¯ãæãç¬åµçã§è€éã§ããã³ãŒã«ããã¯ã®ã¿ã«åºã¥ããŠããŸãã
ããã¯ãã¹ãŠè¯ãããšã§ãããã³ãŒã«ããã¯ã¯å®å
šã§ã¯ãããŸããã ãããã£ãŠãå€ãã®éçºè
ã¯ãããæåããéåæéçºãã¿ãŒã³ãèŠã€ããããšããŠããŸãã ãããã圌ããèšãããã«ãå
éšã§ãã¹ãŠãã©ã®ããã«æ©èœããããçè§£ããã«æœè±¡åã广çã«äœ¿çšããããšã¯äžå¯èœã§ãã
以äžã§ã¯ããã®ãããªæœè±¡æŠå¿µãããã€ã詳ãã調ã¹ãŠãããã«è©³ãã説æããããé«åºŠãªéåæãã³ãã¬ãŒããå¿
èŠã§ããã䜿çšãæšå¥šãããçç±ã瀺ããŸãã
ãã¹ããããã³ãŒã«ããã¯
次ã®ã³ãŒããèŠãŠãã ããã
listen('click', function (e){ setTimeout(function(){ ajax('https://api.example.com/endpoint', function (text){ if (text == "hello") { doSomething(); } else if (text == "world") { doSomethingElse(); } }); }, 500); });
çžäºã«åã蟌ãŸãã3ã€ã®é¢æ°ã®ãã§ãŒã³ãããããããããéåæã«å®è¡ãããäžé£ã®ã¢ã¯ã·ã§ã³ã®ã¹ãããã衚ããŸãã
ãã®ã³ãŒãã¯ãã°ãã°ã³ãŒã«ããã¯å°çãšåŒã°ããŸãã ãããããå°çãã¯ã颿°ãå
¥ãåã«ãªã£ãŠãããšããäºå®ããã³ãŒããããã¯ãçžäºã«äœçœ®åããããå¿
èŠããããšããäºå®ã«ã¯ãããŸããã ããã¯ã¯ããã«æ·±ãåé¡ã§ãã
ãã®ã³ãŒããåæããŸãããã ãŸãã
click
ã€ãã³ããåŸ
ã¡ã次ã«ã¿ã€ããŒãèµ·åããã®ãåŸ
ã¡ãŸããæåŸã«ãAjaxå¿çãå°çããã®ãåŸ
ã¡ãŸãããã®åŸãããããã¹ãŠãåã³çºçããŸãã
äžèŠãããšããã®ã³ãŒãã¯éåæã®æ§è³ªãé£ç¶ããã¹ãããã®åœ¢ã§éåžžã«èªç¶ã«è¡šçŸããŠããããã«èŠãããããããŸããã æåã®ã¹ãããã¯æ¬¡ã®ãšããã§ãã
listen('click', function (e) {
次ã«2ã€ç®ã瀺ããŸãã
setTimeout(function(){
3ã€ç®ã¯æ¬¡ã®ãšããã§ãã
ajax('https://api.example.com/endpoint', function (text){ // .. })
ãããŠæåŸã«ããããèµ·ããããšã§ãïŒ
if (text == "hello") { doSomething(); } else if (text == "world") { doSomethingElse(); }
ãããã£ãŠãéåæã³ãŒããèšè¿°ããããã®åæ§ã®ã¢ãããŒãã¯ãã¯ããã«èªç¶ã«æããŸãããïŒ ãã®ããã«æžãæ¹æ³ããªããã°ãªããŸããã
çŽæ
次ã®ã³ãŒãã¹ãããããã芧ãã ããã
var x = 1; var y = 2; console.log(x + y);
ããã§ã¯ãã¹ãŠãéåžžã«ç°¡åã§ãã倿°
x
ããã³
y
远å ãããã³ã³ãœãŒã«ã«è¡šç€ºãããŸãã ãããã
x
ãŸãã¯
y
å€ãå©çšã§ããããŸã èšå®ãããŠããªãå Žåã¯ã©ãã§ããããïŒ ãµãŒããŒãã
x
ãš
y
æžã蟌ãŸããå
容ãååŸãããã®ããŒã¿ãåŒã§äœ¿çšããå¿
èŠããããšããŸãããã ãµãŒããŒãã
x
ãš
y
å€ãããããããŠã³ããŒããã颿°
loadX
ãš
loadY
ããããšæ³åããŠãã ããã æ¬¡ã«ã
x
ãš
y
å€ãããŒãããããšããã«ããããå ç®ãã
sum
颿°ãããããšãæ³åããŠãã ããã
ããã¯ãã¹ãŠãã®ããã«èŠããŸãïŒæãããããšãèµ·ãããŸããããïŒïŒïŒ
function sum(getX, getY, callback) { var x, y; getX(function(result) { x = result; if (y !== undefined) { callback(x + y); } }); getY(function(result) { y = result; if (x !== undefined) { callback(x + y); } }); } // , `x` function fetchX() { // .. } // , `y` function fetchY() { // .. } sum(fetchX, fetchY, function(result) { console.log(result); });
éåžžã«éèŠãªããšã1ã€ãããŸãã ã€ãŸãããã®ã³ãŒãã§ã¯ã
x
ãš
y
ãå°æ¥åãåãå€ãšããŠæ±ããæäœã®
sum(âŠ)
ïŒå®è£
ã®è©³çްã«å
¥ããã«åŒã³åºãããå ŽåïŒãéèŠã§ã¯ãªãããã«èšè¿°ããŸãåŒã³åºããããšãã«
x
ãš
y
ãã©ããã
ãã¡ãããããã§ç޹ä»ãã倱瀌ãªã³ãŒã«ããã¯ã¢ãããŒãã«ã¯ãå€ãã®èŠæãæ®ãããŠããŸãã ããã¯ãåºçŸã®ç¹å®ã®æéãæ°ã«ããã«ãå°æ¥ã®äŸ¡å€ãã§åäœããããšãå¯èœã«ããå©ç¹ãçè§£ããããã®æåã®å°ããªã¹ãããã«ãããŸããã
çŽæå€
æåã«ãPromiseã䜿çšããŠ
x + y
æäœãã©ã®ããã«è¡šçŸã§ããããèŠãŠã¿ãŸãããã
function sum(xPromise, yPromise) { // `Promise.all([ .. ])` , // , // , return Promise.all([xPromise, yPromise]) // , // `X` `Y` . .then(function(values){ // `values` - // return values[0] + values[1]; } ); } // `fetchX()` `fetchY()` // . // ** **. sum(fetchX(), fetchY()) // // . // `then(...)` // . .then(function(sum){ console.log(sum); });
ãã®äŸã§ã¯ã2ã€ã®çŽæã®å±€ããããŸãã
fetchX()
ããã³
fetchY()
åŒã³åºãã¯çŽæ¥å®è¡ãããããããè¿ãå€ïŒçŽæïŒïŒã¯
sum(...)
æž¡ãã
sum(...)
ã ãããã®ãããã¹ã衚ãå€ã¯ãçŸåšãŸãã¯åŸã§ããã«äœ¿çšããæºåãã§ããŠããå ŽåããããŸãããåãããã¹ã¯å€ã®å¯çšæ§ã®ç¬éãããèªäœã§ã¯éèŠã§ã¯ãªãããã«åäœããŸãã ãã®çµæãæéãåç
§ããã«
x
ãš
y
å€ã«ã€ããŠèª¬æããŸãã ãããã¯å°æ¥ã®æå³ã§ãã
promiseã®2çªç®ã®ã¬ã€ã€ãŒã¯ã
sum(âŠ)
åŒã³åºããäœæããŠè¿ãïŒ
Promise.all([ ... ])
ã䜿çšããŠïŒ
Promise.all([ ... ])
sum(âŠ)
ã
then(âŠ)
åŒã³åºãããšã«ããããã®promiseãè¿ãå€ãæåŸ
ããŸãã
sum(âŠ)
æäœãå®äºãããšãåèšã®å°æ¥ã®äŸ¡å€ãæºåã§ããããã衚瀺ã§ããŸãã
sum(âŠ)
å
ã«å°æ¥ã®
x
ãš
y
å€ãæåŸ
ããããžãã¯ãé ã
sum(âŠ)
ã
sum(âŠ)
å
éšã§
Promise.all([ ⊠])
ãåŒã³åºããšãpromiseïŒ
promiseX
ããã³
promiseY
åŸ
ã£ãŠãã
Promise.all([ ⊠])
ãäœæãããããšã«æ³šæããŠãã ããã
.then(âŠ)
,
values[0] + values[1]
( , ). ,
then(âŠ)
, , ,
sum(âŠ)
, , ,
Promise.all([ ... ])
. ,
then(âŠ)
, , , , . ,
.then(âŠ)
.
then(âŠ)
, , . â , . â , :
sum(fetchX(), fetchY()) .then( // function(sum) { console.log( sum ); }, // function(err) { console.error( err ); // - } );
x
y
- , , , s
um(âŠ)
, . ,
then(âŠ)
, . .
, , â , , , , . , , , .
, , . () , , .
, :
function delay(time) { return new Promise(function(resolve, reject){ setTimeout(resolve, time); }); } delay(1000) .then(function(){ console.log("after 1000ms"); return delay(2000); }) .then(function(){ console.log("after another 2000ms"); }) .then(function(){ console.log("step 4 (next Job)"); return delay(5000); }) // ...
delay(2000)
, 2000 .,
then(âŠ)
, ,
then(âŠ)
2000 .
, , , , , , . , , . . , , , , , .
?
, , ,
Promise
. , , , .
,
new Promise(âŠ)
, , ,
p instanceof Promise
. , .
, ( , ),
Promise
, , . , , .
, - , , ES6. , , , , .
,
TypeError
ReferenceError
, .
äŸïŒ
var p = new Promise(function(resolve, reject){ foo.bar(); // `foo` , ! resolve(374); // :( }); p.then( function fulfilled(){ // :( }, function rejected(err){ // `err` `TypeError` // `foo.bar()`. } );
, , JS- ( ,
then(âŠ)
)? , , , , :
var p = new Promise( function(resolve,reject){ resolve(374); }); p.then(function fulfilled(message){ foo.bar(); console.log(message); // }, function rejected(err){ // } );
, ,
foo.bar()
«». , . , , . ,
p.then(âŠ)
,
TypeError
.
, .
, ,
done(âŠ)
, , «».
done(âŠ)
, ,
done(âŠ)
, , , , .
, , , :
done(âŠ)
( ):
var p = Promise.resolve(374); p.then(function fulfilled(msg){ // , // console.log(msg.toLowerCase()); }) .done(null, function() { // , });
ES8: async / await
JavaScript ES8
async / await
, . ,
async / await
, .
,
async
.
AsyncFunction . , , .
,
Promise
. ,
Promise
, , . ,
async
, , .
,
async
,
await
, , . async- , , , .
Promise JavaScript Future Java C#.
async / await
, .
:
// - JS- function getNumber1() { return Promise.resolve('374'); } // , getNumber1 async function getNumber2() { return 374; }
, , , :
function f1() { return Promise.reject('Some error'); } async function f2() { throw 'Some error'; }
await
,
async
. . async-,
then
:
async function loadData() { // `rp`- request-promise. var promise1 = rp('https://api.example.com/endpoint1'); var promise2 = rp('https://api.example.com/endpoint2'); // // . var response1 = await promise1; var response2 = await promise2; return response1 + ' ' + response2; } // , `async` // `then` Promise loadData().then(() => console.log('Done'));
« »,
function
. , , , , . IIFE (Immediately Invoked Function Expression, ), .
次ã®ããã«ãªããŸãã
var loadData = async function() { // `rp`- request-promise. var promise1 = rp('https://api.example.com/endpoint1'); var promise2 = rp('https://api.example.com/endpoint2'); // // . var response1 = await promise1; var response2 = await promise2; return response1 + ' ' + response2; }
,
async / await
.

, , â
Babel TypeScript .
async / await
, , .
5 ,
â
async / await
. ,
async / await
, . â
.then()
, , - , , .
, :
/ `rp`- request-promise. rp('https://api.example.com/endpoint1').then(function(data) {
,
async / await
:
// `rp`- request-promise. var response = await rp('https://api.example.com/endpoint1');
â
async / await
. ,
try / catch
.
, . ,
.catch()
,
try / catch
:
function loadData() { try { // . getJSON().then(function(response) { var parsed = JSON.parse(response); console.log(parsed); }).catch(function(e) { // console.log(e); }); } catch(e) { console.log(e); } }
async / await
:
async function loadData() { try { var data = JSON.parse(await getJSON()); console.log(data); } catch(e) { console.log(e); } }
â
async / await
, . â , :
function loadData() { return getJSON() .then(function(response) { if (response.needsAnotherRequest) { return makeAnotherRequest(response) .then(function(anotherResponse) { console.log(anotherResponse) return anotherResponse }) } else { console.log(response) return response } }) }
â
async / await
:
async function loadData() { var response = await getJSON(); if (response.needsAnotherRequest) { var anotherResponse = await makeAnotherRequest(response); console.log(anotherResponse) return anotherResponse } else { console.log(response); return response; } }
â
async / await
, , , , . :
function loadData() { return callAPromise() .then(callback1) .then(callback2) .then(callback3) .then(() => { throw new Error("boom"); }) } loadData() .catch(function(e) { console.log(err); // Error: boom at callAPromise.then.then.then.then (index.js:8:13) });
â ,
async / await
:
async function loadData() { await callAPromise1() await callAPromise2() await callAPromise3() await callAPromise4() await callAPromise5() throw new Error("boom"); } loadData() .catch(function(e) { console.log(err);
â
, , â . ,
.then
«step-over»,
.then
, «» .
async / await
,
await
, â .
ãŸãšã
, . ,
SessionStack , -. , DOM, , JavaScript, , , .
- . , , , , . . , , , .
, . JavaScript, , . , , , .
芪æãªãèªè
ïŒ JS-. ,
- .
â
async / await
. , , , . ( ) a
sync / await
.