ã¿ãªããããã«ã¡ã¯ïŒ
èŠããŠãããããããŸãããã
10æã«Javascriptã§ã®ã¿ã€ããŒã®äœ¿çšã«é¢ããèå³æ·±ãèšäºã翻蚳ããŠããŸããã ãã®ãããã¯ã«æ»ãããã®èšèªã§ã®éåæããã°ã©ãã³ã°ã®è©³çŽ°ãªåæãæäŸããããšèããŠããçµæã«ãããšãããã¯å€§ããªè°è«ãåŒãèµ·ãããŸããã 幎æ«ãŸã§ã«ãŸãšããªè³æãèŠã€ããŠå
¬éã§ããããšãå¬ããæããŸãã çŽ æµãªèªæžãïŒ
Javascriptã§ã®éåæããã°ã©ãã³ã°ã¯ãã³ãŒã«ããã¯ãããããã¹ãããã«ãžã§ãã¬ãŒã¿ãŒãžããããŠããã«
async/await
ãžãšå€æ®µéã«é²åããŸããã å段éã§ãJavascriptã§ã®éåæããã°ã©ãã³ã°ã¯ããã®èšèªã§ãã§ã«ã²ããŸãããŠãã人ã«ãšã£ãŠã¯å°ãç°¡çŽ åãããŸããããåå¿è
ã«ãšã£ãŠã¯ãåãã©ãã€ã ã®ãã¥ã¢ã³ã¹ãç解ããããããã®ã¢ããªã±ãŒã·ã§ã³ããã¹ã¿ãŒããç解ããããšãå¿
èŠã ã£ããããããæããããªããŸãããã¹ãŠã®ä»çµã¿ã
ãã®èšäºã§ã¯ãã³ãŒã«ããã¯ãšãããã¹ã®äœ¿çšæ¹æ³ãç°¡åã«æãåºãããžã§ãã¬ãŒã¿ãŒãç°¡åã«çŽ¹ä»ãããžã§ãã¬ãŒã¿ãŒãšasync / awaitã䜿çšãããè£åŽãã®éåæããã°ã©ãã³ã°ãã©ã®ããã«é
眮ãããŠããããçŽæçã«ç解ã§ããããã«ããããšã«ããŸããã ãã®æ¹æ³ã§ãããŸããŸãªãã©ãã€ã ãé©åãªå Žæã«ç¢ºå®ã«é©çšã§ããããšãé¡ã£ãŠããŸãã
èªè
ã¯éåæããã°ã©ãã³ã°ã®ããã«ã³ãŒã«ããã¯ãPromiseãããã³ãžã§ãã¬ãŒã¿ãŒãæ¢ã«äœ¿çšããŠããããšãããã³Javascriptã§ã®ã¯ããŒãžã£ãŒãšã«ãªãŒåã«ç²ŸéããŠããããšãåæãšããŠããŸãã
ã³ãŒã«ããã¯å°çæåã¯ãã³ãŒã«ããã¯ããããŸããã Javascriptã«ã¯åæI / OïŒä»¥åŸI / OãšåŒã³ãŸãïŒããªããããããã³ã°ã¯ãŸã£ãããµããŒããããŠããŸããã ãã®ãããI / OãæŽçããããããŸãã¯ã¢ã¯ã·ã§ã³ã延æããããã«ããã®ãããªæŠç¥ãéžæãããŸããïŒéåæã«å®è¡ããå¿
èŠãããã³ãŒãã¯ãé
延ããŠå®è¡ãããé¢æ°ã«æž¡ãããã€ãã³ãã«ãŒãã®ã©ããã§èµ·åãããŸããã 1ã€ã®ã³ãŒã«ããã¯ã¯ããã»ã©æªãã¯ãããŸããããã³ãŒãã倧ãããªããéåžžãã³ãŒã«ããã¯ã¯æ°ããã³ãŒã«ããã¯ãçæããŸãã çµæã¯æ¬¡ã®ããã«ãªããŸãã
getUserData(function doStuff(e, a) { getMoreUserData(function doMoreStuff(e, b) { getEvenMoreUserData(function doEvenMoreStuff(e, c) { getYetMoreUserData(function doYetMoreStuff(e, c) { console.log('Welcome to callback hell!'); }); }); }); })
ãã®ãããªãã©ã¯ã¿ã«ã³ãŒããèŠããšãã®ã¬ãã§ãŠã®éèµ·ã®ä»ã«ããã1ã€ã®åé¡ããããŸã
get*UserData()
do*Stuff
ããžãã¯ã®å¶åŸ¡ãä»ã®é¢æ°ïŒ
get*UserData()
ïŒã«å§ä»»ããŸãããã³ãŒã«ããã¯ãå®è¡ããŠãããã©ããã確èªããŠãã ããã ãããã§ããã
çŽæçŽæã¯ãã³ãŒã«ããã¯ã«ãã£ãŠæäŸãããå¶åŸ¡ã®å転ãé転ãããã¹ã ãŒãºãªãã§ãŒã³ã§ã³ãŒã«ããã¯ã®ãã€ãã解ãã®ã«åœ¹ç«ã¡ãŸãã
ããã§ãåã®äŸã¯æ¬¡ã®ããã«å€æã§ããŸãã
getUserData() .then(getUserData) .then(doMoreStuff) .then(getEvenMoreUserData) .then(doEvenMoreStuff) .then(getYetMoreUserData) .then(doYetMoreStuff);
ããreadããããŸãããïŒ
ããããç§ã«èãããŠïŒ ããéèŠãªïŒãããããŸã 倧éšåã¯äžèªç¶ãªïŒã³ãŒã«ããã¯ã®äŸãèŠãŠã¿ãŸãããã
ãã®ããããŠãŒã¶ãŒã®ãããã¡ã€ã«ãéžæãã次ã«ãŠãŒã¶ãŒã®èå³ãéžæãããŠãŒã¶ãŒã®èå³ã«åºã¥ããŠæšå¥šäºé
ãéžæããæåŸã«ãã¹ãŠã®æšå¥šäºé
ãåéããŠãããŒãžã衚瀺ããŸãã ãã®ãããªäžé£ã®ã³ãŒã«ããã¯ã¯ãããããèªãã«æããããããŸããããããã«ããããããããªããšãªãã·ã£ã®ãŒã§ãã äœããããã§çŽæãé©çšããŸã-ãããŠããã¹ãŠãããŸããããŸãã ããïŒ
fetchJson()
ã¡ãœãããå€æŽããŠãã³ãŒã«ããã¯ãåãå
¥ãã代ããã«ãããã¹ãè¿ãããã«ããŸãã çŽæã¯ãJSON圢åŒã§è§£æãããå¿çæ¬æã«ãã£ãŠè§£æ±ºãããŸãã
fetchJson('/api/user/self') .then(function (user) { return fetchJson('/api/user/interests?userId=' + self.id); }) .then(function (interests) { return Promise.all[interests.map(i => fetchJson('/api/recommendations?topic=' + i))]; }) .then(function (recommendations) { render(user, interests, recommendations); });
ããã§ãã çŸåšããã®ã³ãŒãã®äœãåé¡ã«ãªã£ãŠããŸããïŒ
...ãã£ãšïŒ..
ãã®ãã§ãŒã³ã®æåŸã®æ©èœã®ãããã¡ã€ã«ãŸãã¯é¢å¿äºé
ã«ã¢ã¯ã»ã¹ã§ããŸãããïŒ ã ããäœãåäœããŸããïŒ ã©ãããïŒ ãã¹ãããããããã¹ãè©ŠããŠã¿ãŸãããïŒ
fetchJson('/api/user/self') .then(function (user) { return fetchJson('/api/user/interests?userId=' + self.id) .then(interests => { user: user, interests: interests }); }) .then(function (blob) { return Promise.all[blob.interests.map(i => fetchJson('/api/recommendations?topic=' + i))] .then(recommendations => { user: blob.user, interests: blob.interests, recommendations: recommendations }); }) .then(function (bigBlob) { render(bigBlob.user, bigBlob.interests, bigBlob.recommendations); });
ã¯ã...ä»ãç§ãã¡ãæãã§ãããããã¯ããã«äžåšçšã«èŠããŸãã æåŸã«ãªããŸããããç§ãã¡ãã³ãŒã«ããã¯ã®å°çããè±åºããããšããã®ã¯ããã®ãããªã¯ã¬ã€ãžãŒãªå
¥ãå人圢ã®ããã§ããïŒ ä»äœãããïŒ
ã³ãŒãã¯ãã¯ããŒãžã£ãŒã«é Œã£ãŠå°ããããŸããããšãã§ããŸãïŒ
ã¯ããä»ã§ã¯ãã¹ãŠãå®è³ªçã«ç§ãã¡ãæãã§ããæ¹æ³ã§ããã1ã€ã®çããããŸãã
fetchedUser
ããã³
fetchedInterests
ã³ãŒã«ããã¯å
ã®åŒæ°
fetchedInterests
ã
user
ãš
interests
ã§ã¯ãªã
fetchedInterests
æ¹æ³ã«æ³šæããŠãã ããã ãããããªããããªãã¯éåžžã«æ
éã§ãïŒ
ãã®ã¢ãããŒãã®æ¬ ç¹ã¯æ¬¡ã®ãšããã§ããã¯ããŒãžã£ãŒã§äœ¿çšãããã£ãã·ã¥ã®å€æ°ãšåãæ¹æ³ã§å
éšé¢æ°ã«ååãä»ããªãããã«éåžžã«æ³šæããå¿
èŠããããŸãã ã·ã£ããŒã€ã³ã°ãåé¿ããããã®ã³ããæã£ãŠããå Žåã§ããã¯ããŒãžã£ãŒã§éåžžã«é«ãå€æ°ãåç
§ããããšã¯äŸç¶ãšããŠããªãå±éºãªããã§ãããããã¯ééããªãè¯ããããŸããã
éåæãžã§ãã¬ãŒã¿ãŒãžã§ãã¬ãŒã¿ãŒã圹ç«ã¡ãŸãïŒ ãžã§ãã¬ãŒã¿ãŒã䜿çšãããšãè奮ããã¹ãŠæ¶ããŸãã ãã éæ³ã çå®ã¯ã èŠãŠãã ããïŒ
co(function* () { var user = yield fetchJson('/api/user/self'); var interests = yield fetchJson('/api/user/interests?userId=' + self.id); var recommendations = yield Promise.all( interests.map(i => fetchJson('/api/recommendations?topic=' + i))); render(user, interests, recommendations); });
以äžã§ãã åäœããŸãã ãžã§ãã¬ãŒã¿ãŒãã©ãã»ã©çŸããããèŠãŠæ¶ãæµããããžã§ãã¬ãŒã¿ãŒãç»å Žããåã«è¿èŠçŒã§JavascriptãåŠã³å§ããããšãåŸæããŠããŸããïŒ ç§ã¯ããã®ãããªèããäžåºŠç§ã蚪åããããšãèªããŸãã
ããã... ...ããã¯ãã¹ãŠã©ã®ããã«æ©èœããŸããïŒ æ¬åœã«éæ³ïŒ
ãã¡ããïŒ..ããã é²åºã«ç®ãåããŸãã
çºé»æ©ãã®äŸã§ã¯ããžã§ãã¬ãŒã¿ãŒã¯äœ¿ããããããã«èŠããŸãããå®éã«ã¯ãžã§ãã¬ãŒã¿ãŒã§å€ãã®ããšãè¡ãããŠããŸãã éåæãžã§ãã¬ãŒã¿ãŒããã詳现ã«ç解ããã«ã¯ããžã§ãã¬ãŒã¿ãŒãã©ã®ããã«æ©èœããã©ã®ããã«éåæå®è¡ãåæã®ããã«èŠããããããããç解ããå¿
èŠããããŸãã
ååã瀺ãããã«ããžã§ãã¬ãŒã¿ãŒã¯å€ãäœæããŸãã
function* counts(start) { yield start + 1; yield start + 2; yield start + 3; return start + 4; } const counter = counts(0); console.log(counter.next());
ããã¯éåžžã«ç°¡åã§ããããšã«ãããããã§äœãèµ·ãã£ãŠããã®ã話ããŸãããïŒ
const counter = counts();
-ãžã§ãã¬ãŒã¿ãŒãåæåããã«ãŠã³ã¿ãŒå€æ°ã«ä¿åããŸãã ãžã§ãã¬ãŒã¿ãŒã¯ãªã³ãã«ããããžã§ãã¬ãŒã¿ãŒæ¬äœã®ã³ãŒãã¯ãŸã å®è¡ãããŠããŸãããconsole.log(counter.next());
-åºåã®è§£éïŒ yield
ïŒ1ããã®åŸ1ãvalue
ãšããŠè¿ããã done
çµæãfalse
ã«ãªããããåºåã¯ããã§çµäºããªãconsole.log(counter.next());
-ä»2ïŒconsole.log(counter.next());
-ä»3ïŒ çµãã£ãã ãã¹ãŠãæ£ããã§ããïŒ ãã yield 3;
ã§å®è¡ãäžæåæ¢ãyield 3;
å®äºããã«ã¯ãå床nextïŒïŒãåŒã³åºãå¿
èŠããããŸããconsole.log(counter.next());
-ããã§4ãè¿ãããŸãããçºè¡ã¯ãããŠããªããããé¢æ°ãçµäºãããã¹ãŠã®æºåãæŽããŸãããconsole.log(counter.next());
-çºé»æ©ã¯ä»äºãçµããŸããïŒ åœŒã¯ããã¹ãŠãå®äºãããããšãé€ããŠãå ±åãããã®ã¯äœããããŸããã
ããã§ããžã§ãã¬ãŒã¿ãŒãã©ã®ããã«æ©èœããããèŠã€ããŸããïŒ ããããåŸ
ã£ãŠãè¡æçãªçå®ã«ã€ããŠã¯ã©ãã§ããããïŒãžã§ãã¬ãŒã¿ãŒã¯å€ãåãåºãã ãã§ãªããããããé£ãå°œããããšãã§ããŸãïŒ
function* printer() { console.log("We are starting!"); console.log(yield); console.log(yield); console.log(yield); console.log("We are done!"); } const counter = printer(); counter.next(1);
ãµããäœïŒïŒ ãžã§ãã¬ãŒã¿ãŒã¯å€ãçæãã代ããã«æ¶è²»ããŸãã ããã¯ã©ã®ããã«å¯èœã§ããïŒ
ãã®ç§å¯ã¯
next
æ©èœã«ãããŸãã ãžã§ãã¬ãŒã¿ããå€ãè¿ãã ãã§ãªãããžã§ãã¬ãŒã¿ã«å€ãè¿ãããšãã§ããŸãã
next()
åŒæ°ãæå®ãããšããžã§ãã¬ãŒã¿ãçŸåšåŸ
æ©ããŠãã
yield
æäœã¯ãå®éã«ã¯åŒæ°ã«ãªããŸãã ããããæåã®
counter.next(1)
undefined
ãšããŠç»é²ãããçç±ã§ãã 解決ã§ããåŒãæž¡ãã¯ãããŸããã
ãšã«ããããããããžã§ãã¬ãŒã¿ãŒãåŒã³åºãã³ãŒãïŒæé ïŒãšãžã§ãã¬ãŒã¿ãŒã³ãŒãïŒæé ïŒãäºãã«é£æºããŠãå®è¡ãããŠäºãã«åŸ
æ©ãããšãã«å€ãäºãã«æž¡ãããã«ãããã®ããã«ã ç¶æ³ã¯äºå®äžåãã§ããJavascriptãžã§ãã¬ãŒã¿ãŒã®å Žåãå調çã«ç«¶åããŠå®è¡ãããæé ãå®è£
ããæ©äŒãèæ
®ãããå Žåããããã¯ãã³ã«ãŒãã³ãã§ããããŸãã å®éã
co()
æãåºãããŸãããïŒ
ããããæ¥ãã§ã¯ãããŸãããããã§ãªããã°ç§ãã¡ã¯èªåèªèº«ãè£åããŸãã ãã®å Žåãèªè
ããžã§ãã¬ãŒã¿ãŒãšéåæããã°ã©ãã³ã°ã®æ¬è³ªãçŽæçã«ææ¡ããããšãéèŠã§ãããããè¡ãæè¯ã®æ¹æ³ã¯ããžã§ãã¬ãŒã¿ãŒãèªåã§çµã¿ç«ãŠãããšã§ãã ãžã§ãã¬ãŒã¿ãŒé¢æ°ãäœæãããå®æããé¢æ°ã䜿çšããããžã§ãã¬ãŒã¿ãŒé¢æ°ã®å
éšãèªåã§åäœæããŸãã
ãžã§ãã¬ãŒã¿ãŒã®å
éšããã€ã¹-ãžã§ãã¬ãŒã¿ãŒãçæããŸãããŠãç°ãªãJSã©ã³ã¿ã€ã ã§ãžã§ãã¬ãŒã¿ãŒã®å
éšãã©ã®ããã«èŠãããã¯æ¬åœã«ããããŸããã ããããããã¯ããã»ã©éèŠã§ã¯ãããŸããã ãžã§ãã¬ãŒã¿ãŒã¯ã€ã³ã¿ãŒãã§ãŒã¹ã«å¯Ÿå¿ããŠããŸãã ãžã§ãã¬ãŒã¿ãŒãã€ã³ã¹ã¿ã³ã¹åããããã®ãã³ã³ã¹ãã©ã¯ã¿ãŒãã
next(value? : any)
ã¡ãœããããžã§ãã¬ãŒã¿ãŒã«äœæ¥ãç¶ããŠå€ãäžããããã«åœä»€ãããå€ã®ä»£ããã«
throw(error)
çæãããå Žåã®å¥ã®
throw(error)
ã¡ãœããããããŠæåŸã«ã¡ãœãã
return()
ããŸã ãµã€ã¬ã³ãã§ãã ã€ã³ã¿ãŒãã§ã€ã¹ãžã®æºæ ãéæãããã°ããã¹ãŠãæ£åžžã§ãã
ãããã£ãŠãããŒã¯ãŒã
function*
ããã«ãçŽç²ãªES5ã§åè¿°ã®
counts()
ãžã§ãã¬ãŒã¿ãŒãæ§ç¯ããŠã¿ãŸãããã çŸæç¹ã§ã¯ãã¡ãœããã¯å
¥åãåãä»ããªãããã
throw()
ãç¡èŠããŠå€ã
next()
ã«æž¡ãããšãã§ããŸãã ã©ããã£ãŠããã®ïŒ
ããããJavascriptã«ã¯ãããã°ã©ã ã®å®è¡ãäžæåæ¢ããã³åéããããã®ãã1ã€ã®ã¡ã«ããºã ããããŸãã ããªãã¿ã§ããïŒ
function makeCounter() { var count = 1; return function () { return count++; } } var counter = makeCounter(); console.log(counter());
以åã«ã¯ããŒãžã£ã䜿çšããããšããããªããããªãã¯ãã§ã«ãã®ãããªãã®ãæžããŠãããšç¢ºä¿¡ããŠããŸãã makeCounterã«ãã£ãŠè¿ãããé¢æ°ã¯ããžã§ãã¬ãŒã¿ãŒã®ããã«ãæ°å€ã®ç¡éã·ãŒã±ã³ã¹ãçæã§ããŸãã
ãã ãããã®é¢æ°ã¯ãžã§ãã¬ãŒã¿ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«å¯Ÿå¿ããŠããªãããããã®äŸã§
counts()
ã䜿çšããŠçŽæ¥é©çšããããšã¯ã§ããã4ã€ã®å€ãè¿ããŠçµäºããŸãã ãžã§ãã¬ãŒã¿ãŒã®ãããªé¢æ°ãäœæããæ®éçãªã¢ãããŒãã«ã¯äœãå¿
èŠã§ããïŒ
ã¯ããŒãžã£ãŒãã¹ããŒããã·ã³ãããã³éåŽåïŒ
function counts(start) { let state = 0; let done = false; function go() { let result; switch (state) { case 0: result = start + 1; state = 1; break; case 1: result = start + 2; state = 2; break; case 2: result = start + 3; state = 3; break; case 3: result = start + 4; done = true; state = -1; break; default: break; } return {done: done, value: result}; } return { next: go } } const counter = counts(0); console.log(counter.next());
ãã®ã³ãŒããå®è¡ãããšããžã§ãã¬ãŒã¿ãŒã䜿çšããããŒãžã§ã³ãšåãçµæã衚瀺ãããŸãã ããã§ãã
ããã§ããžã§ãã¬ãŒã¿ãŒã®çæåŽãæŽçããŸããã æ¶è²»ãåæããŸããããïŒ
å®éãå€ãã®éãã¯ãããŸããã
function printer(start) { let state = 0; let done = false; function go(input) { let result; switch (state) { case 0: console.log("We are starting!"); state = 1; break; case 1: console.log(input); state = 2; break; case 2: console.log(input); state = 3; break; case 3: console.log(input); console.log("We are done!"); done = true; state = -1; break; default: break; return {done: done, value: result}; } } return { next: go } } const counter = printer(); counter.next(1);
å¿
èŠãªã®ã¯ã
input
ã
go
åŒæ°ãšããŠè¿œå ãã
go
ã§ãå€ã¯ãã€ãã¢ãŠããããŸãã åã³éæ³ã®ããã«èŠããŸããïŒ ãžã§ãã¬ãŒã¿ãŒã«ã»ãšãã©äŒŒãŠããŸããïŒ
ãã£ãïŒ ãããã£ãŠããžã§ãã¬ãŒã¿ãŒããµãã©ã€ã€ãŒããã³ã³ã³ã·ã¥ãŒããŒãšããŠåäœæããŸããã ãããã®æ©èœãçµã¿åãããŠã¿ãŸãããïŒ ãžã§ãã¬ãŒã¿ãŒã®ãã1ã€ã®ããªã人工çãªäŸã次ã«ç€ºããŸãã
function* adder(initialValue) { let sum = initialValue; while (true) { sum += yield sum; } }
ç§ãã¡ã¯ãã¹ãŠãžã§ãã¬ãŒã¿ãŒã®å°é家ã§ããããããã®ãžã§ãã¬ãŒã¿ãŒã
next(value)
æå®ãããå€ã
sum
ãsumãè¿ãããšã¯æããã§ãã æåŸ
ã©ããã«æ©èœããŸãã
const add = adder(0); console.log(add.next());
ãã£ãããã ã§ã¯ããã®ã€ã³ã¿ãŒãã§ãŒã¹ãéåžžã®é¢æ°ãšããŠæžããŸãããïŒ
function adder(initialValue) { let state = 'initial'; let done = false; let sum = initialValue; function go(input) { let result; switch (state) { case 'initial': result = initialValue; state = 'loop'; break; case 'loop': sum += input; result = sum; state = 'loop'; break; default: break; } return {done: done, value: result}; } return { next: go } } function runner() { const add = adder(0); console.log(add.next());
ãããŒãæ¬æ Œçãªã³ã«ãŒãã³ãå®è£
ããŸããã
çºé»æ©ã®åäœã«ã€ããŠã¯ãŸã è°è«ãã¹ãããšããããŸãã äŸå€ã¯ã©ã®ããã«æ©èœããŸããïŒ ãžã§ãã¬ãŒã¿ãŒå
ã§çºçããäŸå€ãé€ãããã¹ãŠãåçŽã§ã
next()
ã¯äŸå€ãåŒã³åºãå
ã«å°éããããžã§ãã¬ãŒã¿ãŒã¯åæ¢ããŸãã ãžã§ãã¬ãŒã¿ãŒã«äŸå€ãæž¡ãããšã¯ãäžèšã§çç¥ãã
throw()
ã¡ãœããã§è¡ãããŸãã
ã¯ãŒã«ãªæ°æ©èœã§ã¿ãŒãããŒã¿ãŒã匷åããŸãããã åŒã³åºãå
ãäŸå€ããžã§ãã¬ãŒã¿ã«æž¡ããšãåèšã®æåŸã®å€ã«æ»ããŸãã
function* adder(initialValue) { let sum = initialValue; let lastSum = initialValue; let temp; while (true) { try { temp = sum; sum += yield sum; lastSum = temp; } catch (e) { sum = lastSum; } } } const add = adder(0); console.log(add.next());
ããã°ã©ãã³ã°ã®åé¡-ãžã§ãã¬ãŒã¿ãŒã®ãšã©ãŒã®æµžéåå¿ãã©ã®ããã«throwïŒïŒãå®è£
ããŸããïŒ
ç°¡åïŒ ãšã©ãŒã¯åãªãå¥ã®å€ã§ãã 次ã®åŒæ°ãšããŠ
go()
æž¡ãããšãã§ããŸãã å®éãããã§ã¯æ³šæãå¿
èŠã§ãã
throw(e)
åŒã³åºããããšã
yield
ã¯ãç§ãã¡ãthrow eãæžããããã«æ©èœããŸãã ã€ãŸããã¹ããŒããã·ã³ã®ãã¹ãŠã®ç¶æ
ã§ãšã©ãŒããã§ãã¯ãããšã©ãŒãåŠçã§ããªãå Žåã¯ããã°ã©ã ãã¯ã©ãã·ã¥ãããå¿
èŠããããŸãã
ã³ããŒãããã¿ãŒãããŒã¿ãŒã®ä»¥åã®å®è£
ããå§ããŸããã
æš¡æ§è§£æ±ºçããŒã ïŒ å®éã®ãžã§ãã¬ãŒã¿ãŒãšåãããã«ãã¡ãã»ãŒãžãšäŸå€ãçžäºã«æž¡ãããšãã§ããäžé£ã®ã³ã«ãŒãã³ãå®è£
ããŸããã
ããããç¶æ³ã¯æªåããŠããŸãããïŒ ã¹ããŒããã·ã³ã®å®è£
ã¯ããžã§ãã¬ãŒã¿ã®å®è£
ãããŸããŸãé¢ããŠããŸãã ããã ãã§ãªãããšã©ãŒåŠçã®ããã«ã³ãŒãããŽãã«ãªããŸãã ããã«ããé·ã
while
ã«ãããã³ãŒãã¯ããã«è€éã«ãªããŸãã
while
ãå€æããã«ã¯
while
ãç¶æ
ã«ã解ããå¿
èŠããããŸãã ãããã£ãŠãã±ãŒã¹1ã§ã¯ã
yield
ãéäžã§äžæãããããå®éã«ã¯
while
2.5åã®å埩ãå«ãŸããŸãã æåŸã«ããã®äŸå€ãåŠçããããã®ãžã§ãã¬ãŒã¿ãŒã«
try/catch
ããªãå Žåã¯ãåŒã³åºãå
ããäŸå€ãããã·ã¥ããããã®ç¹å¥ãªã³ãŒããè¿œå ããå¿
èŠããããŸãã
ãã£ãïŒ ãžã§ãã¬ãŒã¿ãŒã®å®è£
ã®å¯èœãªä»£æ¿æ¡ã®è©³çŽ°ãªåæãå®äºããŸããããããŠããžã§ãã¬ãŒã¿ãŒãã©ã®ããã«æ©èœããããæ¢ã«ããç解ããŠããããšãé¡ã£ãŠããŸãã 也ç¥æ®æž£äžïŒ
- ãžã§ãã¬ãŒã¿ãŒã¯ãå€ãçæããããå€ãæ¶è²»ãããããŸãã¯ãã®äž¡æ¹ãè¡ãããšãã§ããŸãã
- ãžã§ãã¬ãŒã¿ãŒã®ç¶æ
ãäžæåæ¢ã§ããŸãïŒç¶æ
ãç¶æ
ãã·ã³ããã£ããïŒïŒ
- åŒã³åºãå
ãšãžã§ãã¬ãŒã¿ãŒã«ãããçžäºäœçšããã³ã«ãã³ã®ã»ããã圢æã§ããŸã
- äŸå€ã¯ã©ã®æ¹åã«ã転éãããŸãã
ãžã§ãã¬ãŒã¿ãŒã«ç²ŸéããŠããã®ã§ããããã«ã€ããŠæšè«ããããã®æœåšçã«äŸ¿å©ãªæ¹æ³ãææ¡ããŸãïŒãããã¯ãäžåºŠã«1ã€ãã€å€ãæž¡ããã£ãã«ãä»ããŠå€ãçžäºã«æž¡ã競åçã«å®è¡ãããããã·ãŒãžã£ãŒãäœæã§ããæ§ææ§é ã§ãïŒ
yield
ïŒã ããã¯ãã³ã«ãã³ãã
co()
å®è£
ãäœæãã次ã®ã»ã¯ã·ã§ã³ã§åœ¹ç«ã¡ãŸãã
ã³ã«ãã³å¶åŸ¡ã®é転ããã§ããžã§ãã¬ãŒã¿ãŒã®æäœã«çç·Žããã®ã§ãéåæããã°ã©ãã³ã°ã§ãžã§ãã¬ãŒã¿ãŒãã©ã®ããã«äœ¿çšã§ããããèããŠã¿ãŸãããã ãžã§ãã¬ãŒã¿ããã®ããã«èšè¿°ã§ããå Žåããžã§ãã¬ãŒã¿ã®ãããã¹ãèªåçã«è§£æ±ºããããšããæå³ã§ã¯ãããŸããã ããããåŸ
ã£ãŠãã ãããçºé»æ©ã¯ããèªäœã§åäœããããšãæå³ããŠããŸããã ãããã¯ãå¥ã®ããã°ã©ã ãã¡ã€ã³ããã·ãŒãžã£ã
.next()
ããã³
.throw()
ãåŒã³åºãããã°ã©ã ãšå¯Ÿè©±ããå¿
èŠããããŸãã
ã¡ã€ã³ããã·ãŒãžã£ã§ã¯ãªããžã§ãã¬ãŒã¿ã«ããžãã¹ããžãã¯ãé
眮ãããšã©ããªããŸããïŒ çŽæãªã©ã®ç¹å®ã®éåæå€ãçºçãããã³ã«ããžã§ãã¬ãŒã¿ã¯ããã®ãã³ã»ã³ã¹ãå°ç¡ãã«ããããªãã解決ãããç®èŠãããããããšèšã£ãŠãäžæåæ¢ããŠçŽæãæäŸããŸãã ã¡ã³ããã³ã¹æé ïŒãOKãåŸã§é»è©±ããŸããã ãã®åŸããã®ãããã¹ã«ã³ãŒã«ããã¯ãç»é²ããçµäºããã€ãã³ãã®ãµã€ã¯ã«ãããªã¬ãŒã§ããããã«ãªããŸã§ïŒã€ãŸãããããã¹ã解決ããããŸã§ïŒåŸ
æ©ããŸãã ãããçºçãããšãæé ã¯ããããããªãã®çªã§ãããš
.next()
ä»ããŠå€ãã¹ãªãŒããžã§ãã¬ãŒã¿ãŒã«éä¿¡ããŸãã 圌女ã¯ãžã§ãã¬ãŒã¿ãŒããã®ä»äºãããã®ãåŸ
ã¡ããã®éã«ä»ã®éåæçãªããšãããŸã...ãªã©ã ãžã§ãã¬ãŒã¿ãŒã®ãµãŒãã¹ã§ããã·ãŒãžã£ãã©ã®ããã«çãæ®ããã«ã€ããŠã®æ²ãã話ãèããŸããã
ããã§ã¯ãã¡ã€ã³ãããã¯ã«æ»ããŸãã ãžã§ãã¬ãŒã¿ãŒãšãããã¹ã®ä»çµã¿ãããã£ãã®ã§ããã®ãããªããµãŒãã¹æé ããäœæããããšã¯é£ãããããŸããã ãµãŒãã¹ããã·ãŒãžã£èªäœã¯ãçŽæãšããŠç«¶äºçã«å®è¡ããããžã§ãã¬ãŒã¿ãã€ã³ã¹ã¿ã³ã¹åããŠç¶æãã
.then()
ã³ãŒã«ããã¯ã䜿çšããŠã¡ã€ã³ããã·ãŒãžã£ã®æçµçµæã«æ»ããŸãã
次ã«ãcoïŒïŒããã°ã©ã ã«æ»ããããã«è©³ãã説æããŸãã
co()
ã¯ããžã§ãã¬ãŒã¿ãŒãåæå€ã§ã®ã¿åäœã§ããããã«ãã¹ã¬ãŒãåŽåãåŒãåãããµãŒãã¹æé ã§ãã ãã§ã«ã¯ããã«è«ççã«èŠããŸãããïŒ
co(function* () { var user = yield fetchJson('/api/user/self'); var interests = yield fetchJson('/api/user/interests?userId=' + self.id); var recommendations = yield Promise.all( interests.map(i => fetchJson('/api/recommendations?topic=' + i))); render(user, interests, recommendations); });
ã¹ããªã³ã°ããŒãé¢æ°ã«ç²ŸéããŠãã人ã¯ã
co()
ããããã¹ããã£ã¹ãããã¹ããªã³ã°ããŒãé¢æ°ã®éåæããŒãžã§ã³ãšèããããšãã§ããŸãã
ããã°ã©ãã³ã°ã¿ã¹ã¯-coïŒïŒã¯ç°¡åãããïŒ
co()
, , .
co()
- ,
.next()
, {done: false, value: [a Promise]}
- ( ),
.next()
, - , 4
- -
{done: true, value: ...}
, , co()
, co(), :
function deferred(val) { return new Promise((resolve, reject) => resolve(val)); } co(function* asyncAdds(initialValue) { console.log(yield deferred(initialValue + 1)); console.log(yield deferred(initialValue + 2)); console.log(yield deferred(initialValue + 3)); }); function co(generator) { return new Promise((resolve, reject) => {
解決ç, ? - 10
co()
, . , . ?
â co(), , , ,
co()
. ,
.throw()
.
function deferred(val) { return new Promise((resolve, reject) => resolve(val)); } function deferReject(e) { return new Promise((resolve, reject) => reject(e)); } co(function* asyncAdds() { console.log(yield deferred(1)); try { console.log(yield deferredError(new Error('To fail, or to not fail.'))); } catch (e) { console.log('To not fail!'); } console.log(yield deferred(3)); }); function co(generator) { return new Promise((resolve, reject) => {
解決ç. , ,
.next()
onResolve()
.
onReject()
,
.throw()
.
try/catch
, ,
try/catch
.
,
co()
! !
co()
, , , . , ?
: async/awaitco()
. - , async/await? â ! ,
async await
.
async ,
await
,
yield
.
await
,
async
.
async
- .
,
async/await
, , -
co()
async
yield
await
,
*
, .
co(function* () { var user = yield fetchJson('/api/user/self'); var interests = yield fetchJson('/api/user/interests?userId=' + self.id); var recommendations = yield Promise.all( interests.map(i => fetchJson('/api/recommendations?topic=' + i))); render(user, interests, recommendations); });
:
async function () { var user = await fetchJson('/api/user/self'); var interests = await fetchJson('/api/user/interests?userId=' + self.id); var recommendations = await Promise.all( interests.map(i => fetchJson('/api/recommendations?topic=' + i))); render(user, interests, recommendations); }();
, :
co()
. async , . async
co()
co.wrap()
.co()
( yield
) , , . async
( await
) .
Javascript , , « »
co()
, , ,
async/await
. ? ããã ãã