å€ãã®çŽæã«ã€ããŠæžãããŠããŸãã ãã®èšäºã¯ãPromiseã䜿çšããããã®æãå®çšçãªããªãã¯ãšããããã©ã®ããã«æ©èœãããã«ã€ããŠã®åççã«è©³çŽ°ãªèª¬æããŸãšããè©Šã¿ã«ãããŸããã
çŽæã®æŠèŠ
ãŸããããã€ãã®å®çŸ©ã
ãããã¹ã¯ãéåæåŒã³åºãã®å®è¡ãå¹çåãããªããžã§ã¯ãã§ãã
éåæåŒã³åºãã¯ãã¡ã€ã³ã³ãŒãã¹ããªãŒã ã®å®è¡ãåŒã³åºãã®çµäºãåŸ ããªãé¢æ°åŒã³åºãã§ãã ããšãã°ãhttpèŠæ±ã¯ã¡ã€ã³ã¹ã¬ãããäžæããŸããã ã€ãŸããèŠæ±ãå®è¡ããããã®å®äºãåŸ ããã«ããã«ããã®åŒã³åºãã«ç¶ãã³ãŒããå®è¡ãããhttpèŠæ±ã®çµæãå®äºåŸã«ã³ãŒã«ããã¯é¢æ°ïŒã³ãŒã«ããã¯é¢æ°ïŒã«ãã£ãŠåŠçãããŸãã
次ã«ãpromiseã®æ©èœãé çªã«åŠçããŸãã ããã§ã¯ãç¹å®ã®éåæåŒã³åºããè¡ãããã®promiseãªããžã§ã¯ããæ¢ã«ãããšããäºå®ããé²ããŸãã çŽæãã©ãããæ¥ãã®ãããããŠãããèªåã§ã©ã®ããã«åœ¢æããã®ãã«ã€ããŠã¯åŸã§è©±ããŸãã
1. Promiseã¯ãéåæåŒã³åºãã®ã·ãŒã±ã³ã¹ãå¶åŸ¡ããã¡ã«ããºã ãæäŸããŸãã ã€ãŸããpromiseã¯éåæåŒã³åºãã®åãªãã©ãããŒã§ãã çŽæã¯æ£åžžã«è§£æ±ºãããå Žåãšå€±æããå ŽåããããŸãã ã¡ã«ããºã ã®æ¬è³ªã¯æ¬¡ã®ãšããã§ãã åãããã¹ã¯ãthenïŒïŒãšcatchïŒïŒã®2ã€ã®é¢æ°ãæäŸããŸãã ã³ãŒã«ããã¯é¢æ°ã¯ãåŒæ°ãšããŠåé¢æ°ã«æž¡ãããŸãã 次ã«ãpromiseãæ£åžžã«è§£æ±ºãããå Žåã«ã³ãŒã«ããã¯é¢æ°ãåŒã³åºããããšã©ãŒã®å Žåã«catchã«ã³ãŒã«ãããŸãïŒ
promise.then(function(result){ // }).catch(function(error){ // });
2.次ã«ç解ãã¹ãç¹ã çŽæã¯äžåºŠã ãèš±å¯ãããŸãã ã€ãŸããpromiseå ã§çºçããéåæåŒã³åºãã¯1åã ãå®è¡ãããŸãã å°æ¥çã«ã¯ãpromiseã¯éåæåŒã³åºãã®ä¿åãããçµæãè¿ãã ãã§ããããå®è¡ããªããªããŸãã ããšãã°ãçŽæã®çŽæãããå ŽåïŒ
// promise.then(function(result){ // , // }); // promise.then(function(result){ // . // // });
3. thenïŒïŒããã³catchïŒïŒé¢æ°ã¯promiseãè¿ããŸãã ãããã£ãŠãçŽæã®ãã§ãŒã³ãæ§ç¯ã§ããŸãã ãã®å Žåãã³ãŒã«ããã¯é¢æ°ãthenïŒïŒã§è¿ãçµæã¯ãåŸç¶ã®thenïŒïŒã®ã³ãŒã«ããã¯é¢æ°ã®å ¥åãžã®åŒæ°ãšããŠæž¡ãããŸãã ãŸããthrowïŒã¡ãã»ãŒãžïŒåŒã³åºãã®åŒæ°ã¯ãcatchïŒïŒã®ã³ãŒã«ããã¯é¢æ°ã®åŒæ°ãšããŠæž¡ãããŸãã
promise.then(function(result){ // ( ) return result1; // }).then(function(result){ // result result1, // if(condition){ throw("Error message"); } }).catch(function(error){ // , // , // error "Error message" });
4.ãã®çµæãthenïŒïŒã®ã³ãŒã«ããã¯é¢æ°ã¯ãäœããã®å€ã ãã§ãªããå¥ã®ãããã¹ãè¿ãããšãã§ããŸãã ãã®å Žåããã®ãããã¹ã解決ããçµæã¯ãthenïŒïŒã®æ¬¡ã®åŒã³åºãã«è»¢éãããŸãã
promise1.then(function(result1){ return promise2.then(function(result2){ // - return result3; }); }).then(function(result){ // result result3 }).catch(function(error){ // });
5.ã¢ã¿ããã¡ã³ããªãã®1ã€ã®ç·åœ¢ãã§ãŒã³ã§ãããã¹ã®è§£æ±ºãæ§ç¯ããããšã«ãããåãããšãè¡ãããšãã§ããŸãã
promise1.then(function(result1){ return promise2; }).then(function(result2){ // - return result3; }).then(function(result){ // result result3 }).catch(function(error){ // });
åpromiseãã§ãŒã³ã¯catchïŒïŒåŒã³åºãã§çµäºããããšã«æ³šæããŠãã ããã ãããè¡ããªããšãçºçãããšã©ãŒã¯çŽæã®è žå ã§æ¶ãããšã©ãŒãçºçããå Žæãç¹å®ããããšã¯ã§ããªããªããŸãã
ãŸãšãããš
éåæåŒã³åºãã®ã·ãŒã±ã³ã¹ãäœæããå¿ èŠãããå ŽåïŒã€ãŸããåã®åŒã³åºããå®äºããåŸã次ã®ååŒã³åºããå³å¯ã«å®äºããå¿ èŠãããå ŽåïŒããããã®éåæåŒã³åºããäžé£ã®çŽæã«é 眮ããå¿ èŠããããŸãã
çŽæã¯ã©ãããæ¥ãã®ã§ããïŒ
çŽæã¯2ã€ã®æ¹æ³ã§åãåãããšãã§ããŸãã䜿çšããã©ã€ãã©ãªã®é¢æ°ãæ¢æã®çŽæãè¿ãããçŽæããµããŒãããªãé¢æ°ãžã®éåæåŒã³åºããåå¥ã«çŽæã«å€ããããšãã§ããŸãïŒçŽæïŒã åãªãã·ã§ã³ãåå¥ã«æ€èšããŸãã
ã©ã€ãã©ãªé¢æ°ã®çŽæ
å€ãã®ææ°ã©ã€ãã©ãªã¯ãPromiseã䜿çšããäœæ¥ããµããŒãããŠããŸãã ã©ã€ãã©ãªãpromiseããµããŒãããŠãããã©ããã¯ãããã¥ã¡ã³ããã確èªã§ããŸãã äžéšã®ã©ã€ãã©ãªã¯ãã³ãŒã«ããã¯é¢æ°ãšãããã¹ãšããéåæåŒã³åºããåŠçããããã®äž¡æ¹ã®ãªãã·ã§ã³ããµããŒãããŠããŸãã 人çã®äŸãããã€ãèããŠã¿ãŸãããã
ãŠã©ãŒã¿ãŒã©ã€ã³ORMããŒã¿ããŒã¹ã©ã€ãã©ãª
ããã¥ã¡ã³ãã«ã¯ãã©ã€ãã©ãªé¢æ°ã®äœ¿çšäŸãèšèŒãããŠããŸãïŒããŒã¿ãµã³ããªã³ã°ã®äŸã䜿çšïŒã
Model.find({id: [1,2,3]}).exec(function(error, data){ if(error){ // } else{ // , data } });
ãã¹ãŠãçŸããããã§ãã ãã ããããŒã¿ãéžæããŠåŠçããåŸãããŒã¿ã§ä»ã®æäœãè¡ãå¿ èŠãããå ŽåïŒããšãã°ãããããŒãã«ã®ã¬ã³ãŒããæŽæ°ããå¥ã®ããŒãã«ã«æ°ããã¬ã³ãŒããæ¿å ¥ããïŒãã³ãŒã«ããã¯é¢æ°ã®ãã¹ãã¯ãã³ãŒãã®å¯èªæ§ãæ¥æ¿ã«äœäžããåŸåãããããã«ãªããŸããŒãïŒ
Model.find({id: [1,2,3]}).exec(function(error, data){ if(error){ // } else{ // , data Model_1.update(...).exec(function(error, data){ if(error){/* */} else{ // Model_2.insert(...).exec(function(error, data){ // .. }); } }); } });
äžããããäŸã«ã¡ã€ã³ã³ãŒãããªãå Žåã§ããäœãæžãããããç解ããããšã¯ãã§ã«éåžžã«å°é£ã§ãã ãŸããããŒã¿ããŒã¹ã¯ãšãªãã«ãŒãã§å®è¡ããå¿ èŠãããå Žåãã³ãŒã«ããã¯é¢æ°ã䜿çšãããšãã¿ã¹ã¯ã¯é垞解決ã§ããªããªããŸãã
ãã ããWaterline ORMã©ã€ãã©ãªã®é¢æ°ã¯promiseã§æ©èœããŸãããããã¯äœããã®æ¹æ³ã§ããã¥ã¡ã³ãã«èšèŒãããŠããŸãã ãã ããPromiseã䜿çšãããšã人çãå€§å¹ ã«ç°¡çŽ åãããŸãã ããŒã¿ããŒã¹ã¯ãšãªé¢æ°ããããã¹ãè¿ãããšãããããŸããã ãããŠããã¯ãçŽæã®èšèªã®æåŸã®äŸã次ã®ããã«æžãããšãã§ããããšãæå³ããŸãã
Model.find(...).then(function(data){ // , data return Model_1.update(...); }).then(function(data){ // return Model_2.insert(...); }).then(function(data){ // . . }).catch(function(error){ // });
ã©ã¡ãã®ãœãªã¥ãŒã·ã§ã³ãåªããŠããããèšãå¿ èŠã¯ãªããšæããŸãã ãã¹ãŠã®ãšã©ãŒã®åŠçã1ãæã§è¡ãããããã«ãªã£ãããšã¯ç¹ã«åã°ããããšã§ãã åžžã«è¯ããšã¯èšããŸãããã ãšã©ãŒã®ã³ã³ããã¹ããããçºçããç¹å®ã®ãããã¯ãæ確ã§ã¯ãªãããšãããããããã°ãè€éã«ãªããŸãã ãã®å Žåãåpromiseã«catchïŒïŒåŒã³åºããæ¿å ¥ããããšãçŠæ¢ããŸããã
Model.find(...).then(function(data){ // , data return Model_1.update(...).catch(function(error){...}); }).then(function(data){ // return Model_2.insert(...).catch(function(error){...}); }).then(function(data){ // . . }).catch(function(error){ ... });
ãã®å Žåã§ããã³ãŒãã¯ã³ãŒã«ããã¯é¢æ°ã䜿çšãããããç解ããããã§ãã
MongoDBãæäœããããã®ã©ã€ãã©ãªïŒnode.jsã®ããŒã¹ã©ã€ãã©ãªïŒ
åã®ã±ãŒã¹ãšåæ§ã«ã ããã¥ã¡ã³ãã®äŸã§ã¯ã³ãŒã«ããã¯é¢æ°ã䜿çšããŠããŸãã
MongoClient.connect(url, function(err, db) { assert.equal(null, err); console.log("Connected succesfully to server"); db.close(); });
åã®äŸã§æ¢ã«èŠãŠããããã«ãã³ãŒã«ããã¯ã䜿çšãããšãå€æ°ã®éåæåŒã³åºããé£ç¶ããŠè¡ãå¿ èŠãããå Žåã«éåžžã«å°é£ã«ãªããŸãã 幞ããªããšã«ãããã¥ã¡ã³ãã泚ææ·±ã調ã¹ãŠã¿ããšãã³ãŒã«ããã¯é¢æ°ããã®ã©ã€ãã©ãªã®é¢æ°ãžã®åŒæ°ãšããŠæž¡ããªãå Žåãpromiseãè¿ãããããšãããããŸãã ãããã£ãŠãåã®äŸã¯æ¬¡ã®ããã«æžãããšãã§ããŸãã
MongoClient.connect(url).then(function(db){ console.log("Connected succesfully to server"); db.close(); }).catch(function(err){ // });
ãã®ã©ã€ãã©ãªã䜿çšããç¹æ®æ§ã¯ãããŒã¿ããŒã¹ãžã®ã¯ãšãªãå®è¡ããããã«ãããŒã¿ããŒã¹èšè¿°åãªããžã§ã¯ãdbã䜿çšãããããšã§ããããã¯ãconnectïŒïŒãžã®éåæåŒã³åºãã®çµæãšããŠè¿ãããŸãã ã€ãŸããäœæ¥äžã«ããŒã¿ããŒã¹ã«å¯ŸããŠå€ãã®ã¯ãšãªãå®è¡ããå¿ èŠãããå Žåããã®èšè¿°åãæ¯ååä¿¡ããå¿ èŠããããŸãã ãããŠãããã§ãpromiseã䜿çšããããšã§ãã®åé¡ãçŸãã解決ãããŸãã ãããè¡ãã«ã¯ãããŒã¿ããŒã¹ã«æ¥ç¶ãããšããçŽæãå€æ°ã«ä¿åããŸãã
var dbConnect = MongoClient.connect(url); // // dbConnect.then(function(db){ return db.collection('collection_name').find(...); }).then(function(data){ // // db , // return dbConnect.then(function(db){ return db.collection('collection_name').update(...); }); }).then(function(result){ // update // .. ... }).catch(function(error){ // }); // // , // dbConnect.then(function(db){ ... }).catch(function(error){ ... });
ãã®ãããªã³ãŒãã®ç·šæã§è¯ãã®ã¯ãããŒã¿ããŒã¹ãžã®æ¥ç¶ãäžåºŠç¢ºç«ãããããšã§ãïŒçŽæã¯äžåºŠã ãèš±å¯ãããä¿åãããçµæãåã«è¿ãããããšãæãåºããŸãïŒã ãã ããäžèšã®äŸã«ã¯1ã€ã®åé¡ããããŸãã ããŒã¿ããŒã¹ãžã®ãã¹ãŠã®ã¯ãšãªãå®äºããåŸãããŒã¿ããŒã¹ãžã®æ¥ç¶ãéããå¿ èŠããããŸãã ããŒã¿ããŒã¹ãžã®æ¥ç¶ãéããããšã¯ãPromiseãã§ãŒã³ã®æåŸã«æ¿å ¥ã§ããŸãã ãã ããèµ·åãã2ã€ã®ãã§ãŒã³ã®ã©ã¡ããæ©ãçµäºãããã¯ããããŸãããã€ãŸãã2ã€ã®ãã§ãŒã³ã®ã©ã¡ããããŒã¹ãžã®æ¥ç¶ã®æåŸã«æ¿å ¥ããããæ確ã§ã¯ãããŸããã Promise.allïŒïŒãåŒã³åºããšããã®åé¡ã解決ã§ããŸãã 圌ã«ã€ããŠã¯å°ãåŸã§èª¬æããŸãã
ãããŸã§ã®éãPromiseã䜿çšããŠéåæåŒã³åºããã«ãŒãã§ç·šæããæ¹æ³ã«ã€ããŠã®è°è«ã¯å»¶æããŸãã çµå±ãåè¿°ã®ããã«ãã³ãŒã«ããã¯ã䜿çšããŠããã®åé¡ããŸã£ãã解決ã§ããŸããã
ããã§ãã©ã€ãã©ãªããµããŒãããŠããªãå Žåã«èªåã§ãããã¹ãäœæããæ¹æ³ã®è³ªåã«ç§»ããŸãããã
çŽæãããïŒçŽæïŒ
ã©ã€ãã©ãªããããã¹ããµããŒãããŠããªãããšããããããŸãã ãããŠãã³ãŒã«ããã¯ã®ã¿ã䜿çšããããšããå§ãããŸãã å°ããªã¹ã¯ãªãããšåçŽãªããžãã¯ã®å Žåãããã§æºè¶³ã§ããŸãã ããããããžãã¯ãè€éãªå Žåã¯ãçŽæãªãã«ã¯ã§ããŸããã ãã®ãããPromiseã§éåæåŒã³åºããã©ããã§ããå¿ èŠããããŸãã
äŸãšããŠãredisãªããžããªããå±æ§å€ãååŸããããã«ãéåæé¢æ°ã§ãããã¹ãã©ããããããšãæ€èšããŠãã ããã redisã©ã€ãã©ãªãŒé¢æ°ã¯promiseããµããŒããããã³ãŒã«ããã¯é¢æ°ã§ã®ã¿æ©èœããŸãã ã€ãŸããæšæºã®éåæé¢æ°åŒã³åºãã¯æ¬¡ã®ããã«ãªããŸãã
var redis = require('redis').createClient(); redis.get('attr_name', function(error, reply){ if(error){ // } else{ // } });
次ã«ããã®é¢æ°ãpromiseã§ã©ããããŸãã JavaScriptã¯ããã®ããã®Promiseãªããžã§ã¯ããæäŸããŸãã ã€ãŸããæ°ããçŽæãäœæããã«ã¯ããããè¡ãå¿ èŠããããŸãã
new Promise(function(resolve, reject){ // });
é¢æ°ã¯åŒæ°ãšããŠPromiseã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ããããã®å éšã§éåæåŒã³åºããè¡ãããŸãã ãã®é¢æ°ã®åŒæ°ã¯ãresolveããã³rejecté¢æ°ã§ãã éåæåŒã³åºããæåããå Žåã解決é¢æ°ãåŒã³åºãå¿ èŠããããŸãã éåæåŒã³åºãã®çµæã¯ãresolveé¢æ°ã®å ¥åã«æž¡ãããŸãã ãšã©ãŒãçºçããå Žåã¯ãæåŠé¢æ°ãåŒã³åºãå¿ èŠããããŸãã ãšã©ãŒã¯æåŠé¢æ°ã®å ¥åã«æž¡ãããŸãã
ãã¹ãŠããŸãšãããšãgetïŒattrïŒé¢æ°ãååŸãããredisãªããžããªãããã©ã¡ãŒã¿ãŒãååŸããããã®ãããã¹ãè¿ãããŸãã
var redis = require('redis').createClient(); function get(attr){ return new Promise(function(resolve, reject){ redis.get(attr, function(error, reply){ if(error){ reject(error); } else{ resolve(reply); } }); }); }
以äžã§ãã ããã§ãpromiseã«å¯ŸããŠéåžžã®æ¹æ³ã§getïŒïŒé¢æ°ãå®å šã«äœ¿çšã§ããŸãã
get('attr_name').then(function(reply){ // }).catch(function(error){ // });
ãªããã®ãã¹ãŠã®èŠãã¿
æ£æ°ãªäººãªã誰ã§ããã®è³ªåãããã§ãããã çµå±ã®ãšãããç§ãã¡ã¯ä»äœãããŠããã®ã§ããããïŒ ïŒéåæïŒé¢æ°åŒã³åºããé çªã«å®è¡ããæ¹æ³ã説æããŠããŸããã ãéåžžã®ãïŒéåæåŒã³åºãã§åäœããªãïŒããã°ã©ãã³ã°èšèªã§ã¯ãããã¯åã«åœä»€ãé çªã«æžãããšã«ãã£ãŠè¡ãããŸãã çŽæã¯å¿ èŠãããŸããã ãããŠãåçŽãªäžé£ã®åŒã³åºããè¡ãã«ã¯ãéåžžã«å€ãã®èŠçããããŸãã ãã¶ããéåæåŒã³åºãã¯ãŸã£ããå¿ èŠãããŸãããïŒ ãããã®ããã«éåžžã«å€ãã®åé¡ããããŸãïŒ
ããããéã®è£å°ã¯ãããŸããã éåæåŒã³åºããååšããå ŽåãåŒã³åºããè¡ãæ¹æ³ãéžæã§ããŸãïŒé 次ãŸãã¯äžŠåã ã€ãŸããããã¢ã¯ã·ã§ã³ã®å®è¡ã«å¥ã®ã¢ã¯ã·ã§ã³ã®çµæã®ååšãå¿ èŠãªå Žåãpromiseã§thenïŒïŒåŒã³åºãã䜿çšããŸãã è€æ°ã®ã¢ã¯ã·ã§ã³ã®å®è¡ãäºãã«ç¬ç«ããŠããå Žåããããã®ã¢ã¯ã·ã§ã³ã䞊è¡ããŠéå§ã§ããŸãã
ããã€ãã®ç¬ç«ããã¢ã¯ã·ã§ã³ã®äžŠåå®è¡ãéå§ããæ¹æ³ã¯ïŒ ãããè¡ãã«ã¯ã次ã®åŒã³åºãã䜿çšããŸãã
Promise.all([ promise_1, promise_2, ..., promise_n ]).then(function(results){ // - });
ã€ãŸããpromiseã®é åãPromise.allé¢æ°ã®å ¥åã«æž¡ãããŸãã ãã®å Žåã®ãã¹ãŠã®çŽæã¯ããã«éå§ãããŸãã Promise.allé¢æ°ã¯ããã¹ãŠã®Promiseãå±¥è¡ããPromiseãè¿ãããããã®å Žåã®thenïŒïŒã®åŒã³åºãã¯ãé åã®ãã¹ãŠã®Promiseãå±¥è¡ãããåŸã«ããªã¬ãŒãããŸãã thenïŒïŒã§é¢æ°ã®å ¥åã«æž¡ãããresultsãã©ã¡ãŒã¿ãŒã¯ãPromise.allã®å ¥åã«æž¡ãããé åºã§ã®ãããã¹ã®çµæã®é åã§ãã
ãã¡ãããPromiseã¯Promise.allã«å€ããããšã¯ã§ãããåã«é çªã«å®è¡ããã ãã§ãã ãã ãããã®å Žåããã¹ãŠã®çŽæãå®äºããç¬éã®å¶åŸ¡ã倱ãããŸãã
çŽæãã«ãŒãã«ä¿ã€
å€ãã®å Žåããµã€ã¯ã«å ã§äžè²«ããŠçŽæãæãããšããã¿ã¹ã¯ããããŸãã ããã§ã¯ãpromiseã䞊åçãªå±¥è¡ãèš±å¯ããå Žåãpromise.allã®å ¥åã«æž¡ãïŒãŸãã¯mapãfilterãªã©ã®é¢æ°ã䜿çšããŠïŒã«ãŒãã§promiseã®é åãæ§æããããšã¯ç°¡åã§ã¯ãªããããpromiseã®é 次履è¡ãæ£ç¢ºã«æ€èšããŸãã
ã§ã¯ãã©ã®ããã«çŽæãã«ãŒãã«ä¿ã€ã®ã§ããããïŒ çãã¯ç°¡åã§ã-æ¹æ³ã¯ãããŸããã ã€ãŸããå³å¯ã«èšãã°ããµã€ã¯ã«ã§çŽæãæããããšã¯ã§ããŸãããããµã€ã¯ã«ã§ã¯ã次ã ã«æºããããçŽæã®ãã§ãŒã³ãäœãããšãã§ããŸããããã¯ãåšæçãªéåæã¢ã¯ã·ã§ã³ãšæ¬è³ªçã«åçã§ãã
çŽæã®é£éã®åŸªç°çæ§ç¯ã®ã¡ã«ããºã ã®èå¯ã«ç®ãåããã forã«ãŒããšforEachã«ãŒããšããããã¹ãŠã®ããã°ã©ããŒã«éŠŽæã¿ã®ããã¿ã€ãã®ã«ãŒããåºã«æ§ç¯ããŸãã
forã«ãŒãã§ãããã¹ãã§ãŒã³ãæ§ç¯ãã
äœããã®doSomethingïŒïŒé¢æ°ãäœããã®éåæã¢ã¯ã·ã§ã³ãå®è¡ããçŽæãè¿ãããã®ã¢ã¯ã·ã§ã³ãnåé£ç¶ããŠå®è¡ããå¿ èŠããããšããŸãã promiseèªäœãã次ã®éåæåŒã³åºãã§äœ¿çšãããæååã®çµæãè¿ãããã«ããŸãã ãŸããæåã®åŒã³åºãã空ã®æååã§è¡ããããšä»®å®ããŸãã ãã®å Žåãäžé£ã®çŽæã®æ§ç¯ã¯æ¬¡ã®ããã«è¡ãããŸãã
// var actionsChain = Promise.resolve(""); // for(var i=0; i<n; i++){ actionsChain = actionsChain.then(function(result){ return doSomething(result); }); } // , // actionsChain.then(function(result){ // , }).catch(function(error){ // });
ãã®ãµã³ãã«ãã³ãã¬ãŒãã§ã¯ã説æãå¿ èŠãªã®ã¯æåã®è¡ã®ã¿ã§ãã æ®ãã¯ãäžèšã®è³æããæããã§ãªããã°ãªããŸããã Promise.resolveïŒïŒé¢æ°ã¯æ£åžžã«è§£æ±ºããããããã¹ãè¿ãããã®çµæã¯ãã®é¢æ°ã®åŒæ°ã«ãªããŸãã ã€ãŸããPromise.resolveïŒ ""ïŒã¯æ¬¡ãšåçã§ãã
new Promise(function(resolve, reject){ resolve(""); });
forEachã«ãŒãã§ã®ãããã¹ãã§ãŒã³ã®æ§ç¯
é åã®åèŠçŽ ã«å¯ŸããŠéåæã¢ã¯ã·ã§ã³ãå®è¡ããå¿ èŠããããšããŸãã ãã®éåæã¢ã¯ã·ã§ã³ãdoSomethingïŒïŒé¢æ°ã§ã©ãããããšããã®éåæã¢ã¯ã·ã§ã³ãå®è¡ããçŽæãè¿ãããŸãã ãã®å ŽåãçŽæã®é£éãæ§ç¯ããæ¹æ³ã®ãã³ãã¬ãŒãã¯ãå¥åŠãªããšã«ãforEaché¢æ°ã®äœ¿çšã§ã¯ãªããreduceé¢æ°ã®äœ¿çšã«åºã¥ããŠããŸãã
éå§ããã«ã¯ãreduceé¢æ°ã®åäœãæ€èšããŠãã ããã ãã®é¢æ°ã¯ãäžéçµæãç¶æããªããé åèŠçŽ ãåŠçããããã«èšèšãããŠããŸãã ãããã£ãŠãæçµçã«ã¯ããã®é åã®ç©åçµæãåŸãããšãã§ããŸãã ããšãã°ãreduceé¢æ°ã䜿çšããŠãé åã®èŠçŽ ã®åèšãèšç®ã§ããŸãã
var sum = array.reduce(function(sum, current){ return sum+current; }, 0);
reduceé¢æ°ã®åŒæ°ã¯æ¬¡ã®ãšããã§ãã
é åã®åèŠçŽ ã«å¯ŸããŠåŒã³åºãããé¢æ°ã ãã®é¢æ°ã«æž¡ãããåŒæ°ã¯ãåã®åŒã³åºãã®çµæãé åã®çŸåšã®èŠçŽ ããã®èŠçŽ ã®ã€ã³ããã¯ã¹ãããã³é åèªäœã§ãïŒäžèšã®äŸã§ã¯ãæåŸã®2ã€ã®åŒæ°ã¯å¿ èŠããªãããçç¥ãããŠããŸãïŒã
é åã®æåã®èŠçŽ ãåŠçãããšãã«åã®ã¢ã¯ã·ã§ã³ã®çµæãšããŠæž¡ãããåæå€ã
次ã«ãreduceé¢æ°ã䜿çšããŠã¿ã¹ã¯ã®Promiseã®ãã§ãŒã³ãæ§ç¯ããæ¹æ³ãèŠãŠã¿ãŸãããã
array.reduce(function(actionsChain, value){ return actionsChain.then(function(){ return doSomething(value); }); }, Promise.resolve());
ãã®äŸã§ã¯ãåã®ã¢ã¯ã·ã§ã³ã®çµæã¯actionsChainã®ãããã¹ã§ããã解決åŸãdoSomethingã¢ã¯ã·ã§ã³ãå®è¡ããããã®æ°ãããããã¹ãäœæãããçµæãšããŠè¿ãããŸãã ãã®ãããé åã®åèŠçŽ ã«å¯ŸããŠãã§ãŒã³ãæ§ç¯ãããŸãã Promise.resolveïŒïŒã¯ãactionsChainã®æåã®çŽæãšããŠäœ¿çšãããŸãã
çŽæã䜿çšããããè€éãªäŸ
çŽæãé©çšããããè€éãªäŸãšããŠãäžæã®èå¥åãçæããããã®ãµãŒãã¹ã®ã³ãŒããã©ã°ã¡ã³ããèããŸãã ãµãŒãã¹ã®æ¬è³ªã¯éåžžã«åçŽã§ãããµãŒãã¹ã«å¯ŸããGETèŠæ±ããšã«ã次ã®äžæã®èå¥åãèšç®ããŠè¿ããŸãã ãã ããè€æ°ã®ç«¶åãããªã¯ãšã¹ããåæã«ãµãŒãã¹ã«éä¿¡ã§ãããšããäºå®ãèãããšããããã®ãªã¯ãšã¹ããåŸç¶ã®å®è¡ã®ããã®ãããã¹ã®ãã¥ãŒïŒãã§ãŒã³ïŒã«äžŠã¹ããšããã¿ã¹ã¯ãçºçããŸãã
ãµãŒããŒã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
// HTTP- var server = http.createServer(processRequest); // redis server.on('close', function(){ storage.quit(); }); // server.listen(config.port, config.host); console.log('Service is listening '+config.host+':'+config.port);
ããã¯ãnode.jsã§èšè¿°ãããhttpãµãŒããŒã®æšæºã³ãŒãã§ãã processRequesté¢æ°ã¯ãhttpèŠæ±ãã³ãã©ãŒã§ãã ãµãŒãã¹èªäœã¯redisã¹ãã¬ãŒãžã䜿çšããŠãã®ç¶æ ãä¿åããŸãã redisã®ç¶æ æç¶ã¡ã«ããºã ã¯ããã®äŸãç解ããã®ã«é¢ä¿ããªããããèæ ®ãããŸããã ãã ãããµãŒããŒãã·ã£ããããŠã³ããããredisã§æ¥ç¶ãéããå¿ èŠããããŸããããã¯äžèšã®ã³ãŒãã«åæ ãããŠããŸãã å¯äžéèŠãªããšã¯ããªã¯ãšã¹ãããšã«processRequesté¢æ°ãåŒã³åºãããããšã§ãã èŠæ±ãã¥ãŒã¯requestQueueã®çŽæã§ãã 次ã«ãã³ãŒãèªäœãæ€èšããŸãã
var requestQueue = Promise.resolve(); /** * * * @param {Object} req * @param {Object} res */ function processRequest(req, res){ requestQueue = requestQueue .then(function(){ // GET-, ... if(req.method == 'GET'){ // UUID return calcUUID() // .then(function(uuid){ res.writeHead(200, { 'Content-Type': 'text/plain', 'Cache-Control': 'no-cache' }); res.end(uuid); }) // .catch(function(error){ console.log(error); res.writeHead(500, { 'Content-Type': 'text/plain', 'Cache-Control': 'no-cache' }); res.end(error); }); } // GET-, Bad Request else{ res.statusCode = 400; res.statusMessage = 'Bad Request'; res.end(); } }); }
calcUUID(), . , . . , , .
ãããã«
, , . .
, . - .