ãã®èšäºã¯ããžã¥ãšãªãŒã®äººæ°ãé«ãŸã£ãŠããããã«ä»äºãèŸãã以åã®ä»äºã«å°ãæãå ããªããã°ãªããªãã£ãå®ç³åã®ããã«æžãããŠããŸãã
ããã°ã©ãã³ã°ã®æ°ããæŠå¿µã«åºããããã³ã«ããããçŸå®ã®äžçã«åæ ãããŠããããšãèŠã€ããããšããŸããçŽæ-ãããã¯åæã§ãããããã¯äœã§ããïŒ èª°ããå°æ¥èª°ãã®ããã«äœããããããã»ã¹ã®èª¬æãšããŠãçŽæãè¿œãè¶ãèªç±ãåããŸãã 次ã«ããã®èª¬æãåºçŸ©ã«åœ¢åŒåããããšããŸãã ç§ãã¡ã®æœè±¡çãªæ³ååã§ã¯ã3ã€ã®ãªããžã§ã¯ãã®ã»ãããäžåºŠã«è¡šç€ºã§ããŸãã1ã€ç®ã¯çŽæãããã®ã2ã€ç®ã¯çŽæãããã®ã3ã€ç®ã¯çŽæãããã®ã§ãã ãã§ã«è€éãª3ã»ããã®ãªããžã§ã¯ãããããã¯ã©ã®ãããªé¢ä¿ã«äœçšããŸããïŒãã©ã®ããã«æ¥ç¶ãããŸããïŒ ããã€ãã®è³ªåã åçŽåã®ããã«æåã«ã§ããããšã¯ãæåã®ã»ãããš3çªç®ã®ã»ãããçµã¿åãããããšã§ãããããã®æ§è³ªã¯åãã§ããããã人ãã³ã³ãã¥ãŒãã£ã³ã°ããŒããªã©ã«ãªãå¯èœæ§ããããŸã....æ€èšäžã®ç¹å®ã®æè¡ç°å¢ã®ãã¬ãŒã ã¯ãŒã¯å
ã§ãNode Js bundlesãQ libraryãŠãã€ãããã»ããã¯ããèªäœãããã¯ããŸãã å®éãç§ãã¡ã®ã±ãŒã¹ã§ã¯ãã³ãŒãå
ã§äœããå®è¡ããããšèšã£ããšãã«èªåèªèº«ã«çŽæãããŸãã å®éã«ã¯ãäžåºŠã«2ã»ããã®å Žæãååšããå¯èœæ§ãããã¿ã¹ã¯ãååšããŸãã ããšãã°ãå
±åèšç®ãè¡ãçžäºäœçšãããœãããŠã§ã¢ããŒãããç°å¢ãæ³åããããšã¯ç°¡åã§ããã2ã€ã®ã»ããã¯ãŸã£ãããããŸããã ããããäŸãšããŠQã©ã€ãã©ãªã䜿çšããŠNode.Jsã®promiseãèŠãŠãããŸãã
ãããã£ãŠãã§ããããšã¯ãããã€ãã®ã¿ã¹ã¯ã»ãããå®äºããããšãçŽæããããšã ãã§ãã ããŠãå€ãã®ãªããžã§ã¯ãããããšããã«ãç§ãã¡ã®ã±ãŒã¹ã§ã¯å€ãã®åé¡ãããã®ã§ãæ°åŠè
ãè¡ãããã«ããã®ã»ããã«ããã«é¢ä¿ãå°å
¥ã§ããŸãã ãããŠãé¢ä¿ã®1ã€ãããã«è¡šç€ºãããŸããããã¯ãç§ãã¡ã®å Žåã«é©ããæ¹æ³ã§ããé åºã®é¢ä¿ã§ãã ãããŠããã«ãããããã«ããã®é¢ä¿ã¯promiseãªããžã§ã¯ãã®ãthenãã¡ãœããã«ãã£ãŠå®çŸãããŸãã
çŸå®ã®äžçã«æ»ã£ãŠãããã°ã©ã ãããŒãžã£ãŒã«æ¬¡ã®ãããªçŽæãããããšã¯å¯èœã§ããïŒ
ããµãŒã·ã£ãããèããŠãã ãããåæåã¢ãžã¥ãŒã«ãäœæããåŸãããŒãã¢ãžã¥ãŒã«ãäœæããŸããïŒã
ãµãŒã·ã£ã¯ãã®ãããªçŽæã«æºè¶³ããã空äžã«ã¶ãäžãã£ãŠããé¢ä¿ã®é£éã§ã¯ãªããäœãã«åºã¥ããŠæ§ç¯ããå¿
èŠãããããšã¯æããã§ãã 次ã«ãçŽæãèŠãŠã¿ãŸããããèªåã®ããã«ç¹å®ã®æªæ¥ãèªåçã«æ§ç¯ãããšçŽæãããšããè¡åãå
·äœçãªæªæ¥ã«æ圱ãã倩æã¯ãããæ°žé ã«æ圱ããŸããèšç®ã®æŠå¿µãå€åããŠãããšããçç±ã ãã§ãè¿ãå°æ¥ãèæ
®ããŸãã ãããŠãããã§æ°ããçåãçããŸãããNode Jsã®ç¹å®ã®æªæ¥ãã©ã®ããã«æ³åããŸããã
Node.jsã¯ãéããããã³ã°I / Oã䜿çšããã€ãã³ãæåããã³éåæïŒãŸãã¯ãªã¢ã¯ãã£ãïŒããã°ã©ãã³ã°ã«åºã¥ããŠããŸã-ããã¯WikiããååŸãããã®ã§ãã çŽæã®ç¹ã§ããããç§ãã¡ã«ãšã£ãŠäœãæå³ããã®ãã ããã£ãã¯ãã³ã³ãããŒã«ãã¹ã¯ãªããã«è»¢éããããã³ã«ç¢å°ãä»ããæèšãæ³åããŠãã ããããããããã³ã³ãããŒã«ãããŒãã«è»¢éããããšãããŒãããsoããã§ãŒãºã§ã®ã¿åäœããããšãæå³ããŸããããã®ããããç§ãã¡ã¯ã圌ã«ãã£ãŠå²ãåœãŠãããéåæI / Oã¿ã¹ã¯ã®åé¡ã«é¢ãã圌ã®æŽ»åã®çµæã圌ãç§ãã¡ã«éç¥ãããšä»®å®ããŸãã æªæ¥ãæ§ç¯ããããã®æåã®è©Šã¿ãè¡ãããããåã³ãã£ãã¯éã«åå²ããŸããããŸããå€ãã®ãã£ãã¯ã®é åºé¢ä¿ãå床玹ä»ããŸãã ã©ãããããããæãåºãæ¹æ³ã¯ãªãããã§ãããããŠãå æé¢ä¿ãªãããŠäººã
ãã©ã®ããã«ããã°ã©ã ããã®ãããããªãããšã«æè¬ããŸãã Tick-to-Tackã¢ãã«ã«ç®ãåãããšãå°æ¥ã®ã¢ãã«ãåçŽåããçŽæãããå®çŸããããšã«ããã責任ç¯å²ãçããŸãã
ä»ãç§ãã¡ã¯å°æ¥ãåžžã«ããã£ãã¯ããã§ãŒãºãããããšãç¥ã£ãŠããŸããç§ãã¡ã¯ãã®æªæ¥ã®äž»æš©ãã¹ãã§ãã å¶åŸ¡ããŒããæäŸããããšã§ãã¿ã¹ã¯ãããŒãããããšãæåŸ
ãããéåžžã¯ãããè¡ããŸãã ãããè¡ãæ¹æ³ãæåãããéå§ã¹ã¯ãªãããããããã£ãã¯ãã§ãŒãºã§å®è¡ãéå§ããŸããå®è¡ã®çµæã¯ãåºæ¬ããŒãAPIã«ãã£ãŠåœ¢æãããã¿ã¹ã¯ãããšãã°
fs.readFile(filename, [options], callback)
ã«ãªããŸãã¿ã¹ã¯ã¯ãããŸãããããã°ã©ã ã¯äœæ¥ãçµäºããŸãã ã¿ã¹ã¯ãå®äºãããšããã«ãããŒãã¯æ¬¡ã®ããã£ãã¯ããã§ãŒãºã§ã³ãŒã«ããã¯ã®å®è¡ãèšç»ããããã«å¶åŸ¡ã移ããŸãïŒã³ãŒã«ããã¯ïŒã ãããŠããã®äžã«ä»ã®Nodeã¿ã¹ã¯ãèšå®ããŸãã ãŸããéåæAPIå
šäœãNodeã®ã³ãŒã«ããã¯ã«å®è£
ãããŠããããã説æããã¿ã¹ã¯ã¯ãããã«ãããŸãã
ãããŠããã®ç¶æ³ã¯ãã³ãŒã«ããã¯é¢æ°ã®å°çããšåŒã°ããŠããŸãã ãšããã§ããã©ãŒã©ã ã§ç¹å®ã®åé¡ãè°è«ãããšãã人ã
ã¯ãã®å°çãšéåžžã«è¯ãåéã§ãããªããªãããã©ãŒã©ã ã§ã®ã¡ãã»ãŒãžäº€æã®ã¹ã¿ã€ã«ã¯ãã®ã¹ã¿ã€ã«ã®ãã¹ãŠã®åºæºãæºãããŠããããã§ãã ãããŠããªããããã³ãŒãã®åé¡ã«ãªãå¯èœæ§ãããã®ã§ãããããããã§ããããã°ã©ããŒã¯ã³ãŒãã®é·ãã«å¯ŸããŠã®ã¿æ¯æãããŸããæ°Žå¹³æ¹åã«æ¡åŒµããããã«èª°ãæ¯æããªãããããã§ãªããããããŸããã ãã¡ããã圌ãã¯ã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ã®èŠ³ç¹ããã³ãŒã«ããã¯å°çã«ã€ããŠæžããŠããããã®ãããªã¹ã¿ã€ã«ã®èåŸã«é ããŠãããããããªããã®ããããã«çç¥ããŠããŸãã
ãã®ç¶æ³ãèŠãŠã¿ãŸãããã
a(arg1, function() { var x1; b(arg2, function() { var x2; setInterval(function Task() { console.log('tik'); }, interval); }); })
ããã§ã¯ãäœããè¡ãééééã§Nodeã¿ã¹ã¯ãééã§èšå®ãããšãåŒã³åºãããªãŒã®ãã©ã³ãå
šäœã¯ãã§ãŒã³ãã¯ããŒãžã£ãŒãšãåŒã°ããã¿ã¹ã¯ãåç¶ããŠå®è¡ãããŠããéãã¡ã¢ãªå
ã«ååšãç¶ããŸããã䜿çšãããªãå ŽåããããŸãäžã§èª¬æããå€æ°ãšåŒæ°x1ãx2ãarg1ãarg2 ...ãããŠãããã¯ããã®ãããªãã¹ããããã¿ã¹ã¯ãæžã䟡å€ããããã©ããããã§ã«çåã«æã£ãŠããŸãã ããšãã°ããã®ã±ãŒã¹ã§ã¯ãã¿ã¹ã¯ã¯åã«ãtickããšããåèªã衚瀺ããå ŽåããããŸãã
ãããããããã¯javascriptã®åé¡ã§ããããã®æ§è³ªã¯ããã¹ãŠãå®è¡ã解éã®æ®µéã§çºçããè¶
åçèšèªã§ããããããã¡ããã³ãŒãã®æ§é ã¯å®è¡ã®ã»ãã³ãã£ã¯ã¹ãåæ ããŠããŸãã éçãªã³ã³ãã€ã«èšèªã§ã¯ãé¢æ°å€æ°ãšåŒæ°ã¯ã¹ã¿ãã¯ãŸãã¯ã¬ãžã¹ã¿ãŒã«é
眮ãããé¢æ°ãäœæ¥ãçµäºãããšããã«è§£æŸããããã®ãããªåé¡ã¯çºçããŸããã ãããŠãç¡é§ãªã¡ã¢ãªæ¶è²»ãããã©ãŒãã³ã¹ã®äœäžã«ã€ãªããå¯èœæ§ãããç¶æ³ãããå Žåã¯ãããããåé¿ããæ¹ãè¯ãã®ã§ãããã©ã®ããã«ïŒ
ãããŠãããã«çŽæã®æŠå¿µããããããã«ç¶ããŠãããšãã°äžèšã®ãããªç¶æ³ãåé¿ããããšãã§ããŸãã ããå°ãäžã«ãç§ãã¡ã¯æªæ¥ã®æŠèŠã説æãå§ããããã2ã€ã®ãã§ãŒãºã«åå²ãããã®ãã§ãŒãºã§ãã£ãã¯ãæç»ããããNode jsãã¬ã³ããªã³ã°ããã¿ã¹ã¯ãæäŸã§ããããšã«æ°ä»ããŸããã ããããã³ãŒããé£ç¶ããŠ2åç¶ããŠèšè¿°ãããšã©ããªããŸãããäžèšã®ã³ãŒããåç
§ããŠãã ããã 確ãã«ãç¹å®ã®ééã§ã¿ã¹ã¯ã¯2åå®è¡ãããŸãããã©ã®ãããªé åºã§å®è¡ãããŸããïŒ ãããã誰ããããæ確ã«æããŠãããŸãããç¹å®ã®é åºãæåŸ
ããããšããã§ããŸããããä¿èšŒãããŠããããã§ã¯ãããŸããã ä»ãç§ãã¡ã¯ããŸããŸãªã¿ã¹ã¯ã®é åºé¢ä¿ãæ³ååã«å°å
¥ãããã®å±¥è¡ãèŠæ±ãããã¹ãŠã®æš©å©ãšçŽæã®æŠå¿µãæã£ãŠããããšãæãåºããŸãããããŠããã®ãããªæš©å©ãäžãããšãã¿ã¹ã¯ããã§ãŒã³ã«ãªã³ã¯ããå®è¡ããããšãèŠæ±ã§ããŸãã²ãšã€ãã€ã ããããããã§ã¯äŸãæããªãã§ãå°ãéãããšããå§ããŸãããã ãããŠãjavascriptã§ã®å®è£
ã®èŠ³ç¹ããã®çŽæã¯äœã§ããããã ãŸããjavascriptã®äžéšãšããŠè¡šç€ºãããªããžã§ã¯ãïŒã¿ã¹ã¯ïŒã®æ°ã ããããã®ã¿ã¹ã¯ã«ã€ããŠããç§ãã¡ãçŽæãããã®ã®ãããªãå€ãã®ãªããžã§ã¯ãã«ã€ããŠç§ãæé»ã®ãã¡ã«è©±ãå§ããŠããããããå€ãã®çŽæã«å€ããããšã«æ°ã¥ããªãã£ãã ãã®ã»ããã®ãªããžã§ã¯ãã«ããã€ãã®äºéæ§ãèŠãããŸãã ãã®ãããããã§ã¯åŸã
ã«ç¹å®ã®å®è£
ã«ç§»è¡ããŠããŸãã
ããã°ã©ãã³ã°èšèªã®ãã¬ãŒã ã¯ãŒã¯å
ã§åé¡ã®ã»ããã®é åºé¢ä¿ãå®çŸããããã«ã¯ããã®ã»ããã®åèŠçŽ ã«äºéã®æ§è³ªãäžããªããã°ãªããŸãããããã¯çŽæã§ãããã¿ã¹ã¯ã§ããããŸãã ã€ãŸã ããã§ãã¿ã¹ã¯ã¯å®è¡ã®ããã®åœä»€ã®ã»ããã§ãããå®è¡ãããã¿ã€ãã³ã°ã¯ããããŸãããçŽæã¯æ£ç¢ºã«é åºé¢ä¿èªäœã®åå ã§ãããã¿ã¹ã¯ã®å®è¡ãéå§ãããç¬éã決å®ããã¡ã«ããºã ã¯é ãããŠããŸãã çŽæã¯ãã¿ã¹ã¯ãéè¡ããããã®æ¡ä»¶ãèŠå®ãããŠããçŽã®å¥çŽãªã©ã®å
·äœçãªãã®ã§ãããã¿ã¹ã¯ã¯ããã»ã¹ã§ãããç¡åœ¢ã®äœãã§ããããã®äºéæ§ã¯äžå¯Ÿã®ç©ºéïŒçŽæïŒ-æéïŒã¿ã¹ã¯ïŒãšæ¯èŒã§ããŸãã ã¹ããŒã¹ãã¡ã¢ãªã«é¢é£ä»ããæéãã³ãŒããæ瀺ã«é¢é£ä»ããããšãã§ããŸãã ãã ããjavascriptã«ã¯ãã®äºéæ§ããã€ãã£ãã«å«ãŸããŠãããé¢æ°ã¯ãªããžã§ã¯ãã¡ãœããã ãã§ãªãããããã£ãæã€ããšãã§ããŸãã 欲ãããã®ãéžæããŠãã ããã
Qã©ã€ãã©ãªã®éçºè
ã¯ãæé©ãªãªãã·ã§ã³ã¯ãã€ãã£ãjavascripté¢æ°ãã¿ã¹ã¯ã«å²ãåœãŠããªããžã§ã¯ããpromiseã«å²ãåœãŠãããšã§ãããšå€æããŸããã ã¿ã¹ã¯ããšã³ã³ãŒãããåçŽãªé¢æ°ããããæŠå¿µã®ãã¬ãŒã ã¯ãŒã¯å
ã®ã¿ã¹ã¯ã«ããã«ã¯ã©ãããã°ããã®ã§ããããïŒããããã¹ãŠãšåºå¥ããããã«ãã©ãããã°ããã§ããããïŒ Qãã¿ã¹ã¯ããéåžžã®æ©èœãåé¢ã§ããäžæ¹ã§ããã®æ©èœãååšããªãå Žåã«promiseãã¯ãããžãŒãé©çšã§ããããã«ã圌女ã«ã¯äœããã®åé¡æ©èœãå¿
èŠã§ããããšã¯æããã§ãã Javascriptã«ã¯ååãªåé¡ãªãã·ã§ã³ããããŸãã ããããéçºè
ã¯é¢æ°ã©ãããŒã¡ã«ããºã ã䜿çšããããšã«ããŸãããããã¯ãæ©èœçjavascriptã®æ§è³ªã«éåžžã«èªç¶ã«çŸããé©åããŸãã ã€ãŸã ã©ã€ãã©ãªãŠãŒã¶ãŒã«äŒããé¢æ°ãèšè¿°ããç¹å¥ãªã©ãããŒã©ã€ãã©ãªé¢æ°ã«æž¡ããŸããã³ã³ããã¹ãã§ã¯ããããã¿ã¹ã¯ãšèŠãªããŸãã ã€ãŸã å®éãç§ãã¡ã¯äžè¬ã«ãçŽæã®æŠå¿µã§äœæ¥ãéå§ããããã«ç¹å¥ãªããšã¯äœãã§ããŸããã
ã€ãŸãã2ã€ã®ã¿ã¹ã¯ã®é åºé¢ä¿ãä¿èšŒããããã«ã次ã®ããã«èšè¿°ã§ããŸãã
Q.fcall(function task1() {âŠ}).then(function task2(){âŠ});
ããã§ã¯ãfcallã次ã«ã©ãããŒé¢æ°ã®ã¿ãã¿ã¹ã¯1ãšã¿ã¹ã¯2ãååŸããã¿ã¹ã¯ã«ãªããŸããé¢æ°ã«å¯ŸããŠã¯äœãããŸããããããã®é¢æ°ã¯ãäžèšã®ã³ãŒããå®è¡ããéçšã§é ãããããã£ãèç©ããŸããã ãã®ã³ãŒãããåŸããããã®ã§ãããtask1ã®task2ã®å®è¡ãä¿èšŒãããŸããããã§ã«æ¬¡ã®ããã£ãã¯ãã«å«ãŸããŠããŸãã ã¿ã¹ã¯ã®å®è¡ãšã¯ãé¢æ°ã®å®è¡ãã€ãŸã é¢æ°å
ã§returnåŒãŸãã¯ãã®æåŸã«å°éãããšãïŒyieldã¹ããŒãã¡ã³ããããã§ã¯èŠéããŸãïŒã é¢æ°task1ããã³task2ã«éåæã³ãŒã«ããã¯ã䜿çšããAPIåŒã³åºããããå Žåãå®è¡ã·ãŒã±ã³ã¹ã¯ã³ãŒãã«ãã£ãŠä¿èšŒãããŸãããäžèšãåç
§ããŠãã ãããããã«å¯ŸããŠç¹å¥ãªã¢ã¯ã·ã§ã³ãå®è¡ããªãå Žåãã³ãŒã«ããã¯ã¯åç¬ã§å®è¡ãããŸãã 次ã«ããã®ãããªæ§é ãå¿
èŠãªçç±ãå°ãããšãåã«æžãããšãã§ããŸãïŒ
task1(); task2();
ã¯ããå¯èœã§ãããããšãã°ãæåã®1ã€ãå
éšã§éåæAPIã«ã¢ã¯ã»ã¹ãã2ã€ç®ãããã§ãªãå Žåãtask1ïŒïŒã³ãŒãã§é åºãèšå®ããŸãã task2ïŒïŒ; å
éšã§äœãããã«å€±æããŸãã å¥ã®äŸã§ã¯ãã¿ã¹ã¯AïŒïŒãBïŒïŒãCïŒïŒã®ãããªã·ãŒã±ã³ã¹ããããŸããAãšCã¯éåæã§ãBã¯åæã§ã
Q.fcall(A).then(B).then(C)
ãããã³é¢æ°Bã§åŸè¿°ããããã«ãç¹å¥ãªpromiseãªããžã§ã¯ããè¿ãå¿
èŠã¯ãããŸãããQã©ã€ãã©ãªããããè¡ããŸãã
ç§ãã¡ã¯ä»ãçŽæã«ç®ãåããŸãããããŠã圌ããããã«çŸããå Žæããããã®çŽçã¯ãçŽçãªãã§èšãããã«ãç§ã®å
åŒãšç§ã¯ååã§ã¯ãããŸããã 建èšã®è
žã§ã¯ãäžèšãåç
§ããŠãçŽæãçãŸãããã®å®è£
ã®çµæãçŽæã«ãªããŸãã å
éšã§ãããã©ã®ããã«è¡ãããQã©ã€ãã©ãªãå®è£
ããããšãã°ããæŸçœ®ãããŸãããæãéèŠãªããšã¯ãQé¢æ°ã®ã¢ããïŒfcallãthenãªã©ïŒãšåŒã°ããããšãããäžé£ã®åŒã³åºããã»ãšãã©åžžã«çŽæãçæããããšãç解ããããšã§ãä»ã®ã¢ããéã®ãªã³ã¯ãšããŠã äœæããããã®ã®è
žã«ã¯ç¶æ³ãå®å
šã«å¶åŸ¡ããã®ã«å¿
ãããååã§ã¯ãªããšãã説æããããŠãã¡ãããã©ã€ãã©ãªã¯çŽæãæ瀺çã«äœæããããã®ã¡ã«ããºã ãæäŸããŸãã
ãããªãã§è¡ãããšã¯å¯èœã§ããïŒãªããããå¿
èŠã§ããïŒ åæã¿ã¹ã¯ã®ã¿ã䜿çšããå Žåãæ確ãªçŽæãäœæããå¿
èŠã¯ãããŸããã éåæããŒãJS APIã䜿çšããå ŽåãQã©ã€ãã©ãªãŒã«ã¯ãPromiseãæé»çã«äœæããã©ããã³ã°é¢æ°ããããŸãã éåæã¿ã¹ã¯ã§äœæ¥ããå Žåã§ããæ瀺çã«ãããã¹ãäœæããããã®ã¡ã«ããºã ã䜿çšããªãçè«çãªå¯èœæ§ããããŸãã ããã«ããã®ã©ãããŒã¹ã¿ã€ã«ã¯ãéåæé¢æ°ã®æåŸã®ãã©ã¡ãŒã¿ãŒãšããŠãã©ãŒã ïŒãšã©ãŒãçµæïŒã®ã³ãŒã«ããã¯é¢æ°ãåããä»ã®ã©ã€ãã©ãªã®ãã¹ãŠã®éåæé¢æ°ã«é©çšãããŸãã
ããã¥ã¢ã«ã©ã€ãã©ãªQã®äŸã次ã«ç€ºããŸãã
Q.nfapply(FS.readFile, ["foo.txt", "utf-8"]).done(function task (text) { ⊠});
ããã§ãæšæºã®readFile Node JSé¢æ°ã®åŒã³åºããã©ã®ããã«åŒã³åºããããã確èªã§ããŸãã nfapplyåŒã³åºãã«ãªããŸããããã¯ãã©ãããããé¢æ°ãšã次ã®ãã£ãã¯ã§åŒã³åºããããšãã«readFileã«æž¡ãããåŒæ°ã®é
åã®2ã€ã®åŒæ°ãåããŸãã ãããŠãã³ãŒã«ããã¯é¢æ°readFileã¯ã©ãã«è¡ããŸãããïŒ ãã®ãããªæ§é ã§ã¯ãé¢æ°ãèªåçã«ãã®å ŽæããšããŸã;ãã®äŸã§ã¯ãååã¯taskã§ãããpromise doneãªããžã§ã¯ãã¡ãœããã«æž¡ãããŸãã é©ããããšã«ãQã¯éåæé¢æ°ãã¿ã¹ã¯ãå®äºãããšããã«å¶åŸ¡ãã¿ã¹ã¯ã«ç§»ãããšã«æ°ä»ãå§ããŸããã ãããŠã圌女ããããã©ãããã
nfapplyé¢æ°ãã»ãŒè¡ãããšã®æ¬äŒŒã³ãŒãã¯æ¬¡ã®ãšããã§ãã
function nfapply(readFile, [argsâŠ]) { var deffered = Q.defer(); readFile([argsâŠ], deffered .resolver()); return deferred.promise; }
ããã§ãé
延ãªããžã§ã¯ããäœæãããŸã;ãã®ãªãŸã«ããŒã¡ãœããã¯é¢æ°ãè¿ããreadFileé¢æ°ã®ã³ãŒã«ããã¯ãšããŠçœ®ãæãããããã³ãã©ãŒãåŒã³åºããŸãããããã³ãã©ãŒã®ç°¡ç¥åããã圢åŒã¯æ¬¡ã®ããã«ãªããŸãã
function handler(err, result) { if (err) deffered.reject(err); else deffered.resolve(result); }
åºæ¬çãªç解ãè€éã«ããªãããã«ãäŸå€åŠçã«é¢é£ããåé¡ã«ã€ããŠã¯æå³çã«è§ŠããŸããã
éåæé¢æ°ã®ã©ãããŒãã³ãŒã«ããã¯é¢æ°ã®å€èŠ³ã«å¶éã課ãçç±ãæããã«ãªããŸãããã©ãããŒé¢æ°ã®ã»ãã³ãã£ã¯ã¹ãåçã«å€åããçŽæãå®å
šã«è§£æ±ºããã³æåŠããããã»ã¹ãå¶åŸ¡ããããã«ãªããžã§ã¯ããæ瀺çã«äœæããã«è¡ãããšãã§ããªããããåŒæ°ã亀æããŠå Žæãå€ããã ãã§ååã§ãã
Promiseãªããžã§ã¯ããå«ãé
延ãªããžã§ã¯ããè¿ãQ.deferïŒïŒã¡ãœãããåŒã³åºãã ãã§ãPromiseãäœæã§ããŸããããã«ã€ããŠã¯æ¢ã«èª¬æããŸããã ãŸãããé
延ããªããžã§ã¯ãã®ã¡ãœããã䜿çšãããšãå®éã«ããããšåãããšãçŽæã§è¡ãããšãã§ããŸããæåŠ-æåŠãå®è¡-解決ãé²è¡ç¶æ³ã®éç¥-éç¥ã ãèªç±ã«è³ªåããŠãã ãããQã©ã€ãã©ãªã®ãã¬ãŒã ã¯ãŒã¯å
ã§çŽæã延æã§ããªãã®ã¯ãªãã§ããã äžæåæ¢ã¡ãœãããå®è£
ãããŠããªãçç±ã
é 次å®è¡ãããã¿ã¹ã¯ã®ãã§ãŒã³ãé¢æ°ã«æ»ããŸãããã ãªã¬ãŒãªã¬ãŒç«¶æã®ãã¬ãããã«ãšããŠæ³åããŠã¿ãŸãããã ã¿ã¹ã¯ã¯ãè·é¢ãèµ°ã£ãŠã次ã®ã¿ã¹ã¯ã§ãããã©ã°ãå¥ã®ã©ã³ããŒã«æž¡ãã©ã³ããŒã§ãã ã¢ã€ãã¢ã®ãã§ãã¯ããã¯ã¹ã¯ãã£ããã·ã¥ã©ã€ã³ã«å°éããå¿
èŠããããŸãã ãã©ã°ã¯ãå¥ã®ã¿ã¹ã¯ãããã眮ãæããªããšæ±ºå®ãããŸã§ããŸãã¯ãã£ããã·ã¥ã©ã€ã³ã«å°éãããŸã§ãããã¿ã¹ã¯ããå¥ã®ã¿ã¹ã¯ã«æž¡ãããçŽæãšèããããšãã§ããŸãã 眮æã¯ç°¡åãªæ¹æ³ã§è¡ãããå®è¡äžã«ã©ã³ããŒããã±ããããæãåãåºããŠããããèŠãæéããªã次ã®ã©ã³ããŒã«æž¡ããŸãã ãã¹ãŠã®ã©ã³ããŒããã©ã°ãå€æŽã§ããŸãã ã³ãŒãå
ã§çœ®æãè¡ãããã«ã¯ãé¢æ°å
ã«ããã ãã§ã-ã¿ã¹ã¯ã¯ãpromiseãªããžã§ã¯ããè¿ããŸãã ãããè¡ããšãQã©ã€ãã©ãªããããç解ãã次ã®ã¿ã¹ã¯ã¯ãresolveãŸãã¯reject deferredãåŒã³åºããŠçŽæãæåŠãŸãã¯ä¿æããåŸã«ã®ã¿å®è¡ãéå§ããŸãã 以äžã«ãç°¡åãªå³ãåºæ¬çãªãã³ãã¬ãŒãã瀺ããŸãã
Q.fcall(function task1() { var deferred = Q.defer(); asyncOp(function callback(result) { ⊠deferred .resolve(result); };) return deferred.promise; }).then(function task2(result){ console.log(result); });
2ã€ã®ãªã³ã¯ã®æ¥ç¶æ¹æ³ãç解ããŠããã°ããã«ããªã³ã¯ãã§ãŒã³ãç°¡åã«çµã¿ç«ãŠãããšãã§ããŸãã ããããããã«ã¯äžã€ã®ããšããããŸãããç§ãã¡ãæ€èšããŠããææãªã¿ã¹ã¯ã®ã»ããå
šäœã§ã¯ãããŸãããå®éã«ã¯ãé åºé¢ä¿ããããŸãã äžéšã®ã¿ã¹ã¯ã§ã¯é åºã決å®ã§ããŸãããããã§ãªãã¿ã¹ã¯ããããŸãã ãŸããçžäºã«é¢é£ããé åºã決å®ããªããã®ã¯ãçžäºã«ç¬ç«ããã¿ã¹ã¯ã®ã°ã«ãŒãã«çµåã§ãã䞊è¡ããŠå®è¡ã§ããŸãã ãã®å ŽåãQã©ã€ãã©ãªã«ã¯ããã®åäœãå®è£
ã§ããæ§é ããããŸãã Q.allé¢æ°ïŒ[...]ïŒã¯ãpromiseãªããžã§ã¯ãã®é
åãåŒæ°ãšããŠåãããã¹ãŠã®ãªããžã§ã¯ããå®è¡ãããããå°ãªããšã1ã€ãæåŠããããšããã«ãããç¥ãããŸãã ãããŠåœŒå¥³ã¯ãããåçŽã«è¡ãããã¹ãŠåãçŽæïŒçŽæãªããžã§ã¯ãïŒãç§ãã¡ã«è¿ããŸãã 䞊åã¿ã¹ã¯ã¯ããã§ãŒã³äžã®è£
食ãšèŠãªãããšãã§ããŸãã ããã§ãæšæºçãªãžã¥ãšãªãŒãäœæã§ããŸãã
Q.deferïŒïŒãæžãããšãã«é
延ãªããžã§ã¯ããååŸãããšãããªãpromiseã®çŽæãããã§ã¯ãªãã®ããäœããã®è£å©ãªããžã§ã¯ããå¿
èŠãªã®ããããçš®ã®å察æ§ãããã®ãââãçŽæãè»éã«å
¥ããããã»ã¹ããã詳ããèããŠã¿ãŸãããã ãã±ãããè»éã«æå
¥ãããšãé¢éžäžã«äœã倱ãããŸããïŒ ããã§ãåãããšãèµ·ãããŸãã 圌ã¯ä»äºã延æããŸããããä»ã§ã¯å€§èã«æ©ããããã«ãªããŸããã ãã®ãªããžã§ã¯ããäœæãããšãã«å¿
èŠãªã®ã¯ãååãšããŠã次ã®ã¡ãœããã®ããããã®åŒã³åºããrejectãresolveã§ããããã¯ãçŽæãããã€ãã®ããŸã å€æŽãããŠããªãç¶æ
ã«å€æããŸãã ãããã®ã¡ãœããã®åŒã³åºãã¯ãã¹ãããããã±ããããåé¢ãããç¬éãšæ¯èŒã§ããŸããã¹ããããåé¢ãããåŸãã¹ããããæ£åžžã«åé¢ãããå Žåããã±ããã¯ãã§ã«å¥ã®ç¶æ
ã«ããããã®åŸãå éãããããã§ãªãå Žåããããªã®ç¶æ
ã«ãªããŸãã , resolve, reject, , , , Q. , . , deferred.resolve(value) deferred.reject(value) value .
, , , , , nfapply, fcall , , . â , .. .
, - .