ããŒã©ã³ã»ããŒãœã³ã®èšäºã ç§ãã¡ã¯çŽæã«åé¡ããããŸã ãã®ç¿»èš³ã玹ä»ãããŠãã ãããçŽæã«ã¯åé¡ããããŸãã
JavaScriptéçºè
ã®çããããããèªããæãæ¥ãŸãã-çŽæã«åé¡ããããŸãã
ããããçŽæãã®ãã®ã§ã¯ãããŸããã
A +仿§ã«ããå®è£
ã¯åªããŠããŸãã ãªããAPIã§èŠåŽããŠããããã°ã©ããŒã®æ°ã芳å¯ããŠããé·å¹Žã«ããã£ãŠãããèªäœãç§ã®åã«çŸããäž»ãªåé¡ã¯æ¬¡ã®ãšããã§ãã
ãç§ãã¡ã®å€ãã¯ãå®éã«ããããçè§£ããã«çŽæã䜿çšããŸããã
ç§ãä¿¡ããªããªãããã®åé¡ã解決ããŠãã ããïŒ
質åïŒããã4ã€ã®Promiseã®äœ¿çšã®éãã¯äœã§ããïŒdoSomething().then(function () { return doSomethingElse(); }); doSomething().then(function () { doSomethingElse(); }); doSomething().then(doSomethingElse()); doSomething().then(doSomethingElse);
ããªããçããç¥ã£ãŠãããªããç§ã¯ããªããç¥çŠãããŠãã ãã-ããªãã¯çŽæã«é¢ããå¿è
ã§ãã ãããããããªãã¯ãã®æçš¿ããã以äžèªãããšãã§ããŸããã
ããªãã®æ®ãã®99.99ïŒ
ãç§ã¯ããªããåæºããŠããªããããªãã¯è¯ãäŒç€Ÿã«ãããšèšã£ãŠæ¥ãã§ããŸãã
ç§ã®ãã€ãŒãã«çãã人ã¯èª°ãåé¡ã解決ã§ããŸããã§ããã 3çªç®ã®è³ªåãžã®çãã«ç§ãéåžžã«é©ããã ã¯ããç§ã圌ã«å°ãããšããäºå®ã«ããããããïŒ
ãã®åé¡ã«å¯Ÿããçãã¯èšäºã®æåŸã«ãããŸããããŸããæåã®è¿äŒŒã§çŽæãããã»ã©æœäŒããŠããçç±ãšãåå¿è
ãå°éå®¶ã®å€ããããªã«é¥ãçç±ã説æããããšæããŸãã ãŸããçŽæãããããçè§£ããã®ã«åœ¹ç«ã€ãçããããªãã¯ã®1ã€ã§ãããœãªã¥ãŒã·ã§ã³ãæäŸããããšæããŸãã ãããŠããã¡ãããç§ã®èª¬æã®åŸã圌ãã¯ããªãã«ãšã£ãŠããã»ã©è€éã«èŠããªããªããšä¿¡ããŠããŸãã
å§ããåã«ãããã€ãã®ãã€ã³ããæŠèª¬ããŸãããã
ãªãçŽæããã®ãïŒ
çŽæã«é¢ããèšäºãèªããšãç»é¢ã®å³åŽã«ããŒãžãåŒã䌞ã°ãã²ã©ãã³ãŒã«ããã¯ã³ãŒãã«ãã£ãŠåœ¢æããããéåœã®
ãã©ããã ããžã®åç
§ããã衚瀺ãããŸãã
Promiseã¯ãã®åé¡ã解決ããŸãããã€ã³ãã³ããæžããã ãã§ã¯ãããŸããã çŽ æŽãããäŒè©±ã
å°çã®ã³ãŒã«ããã¯ããã®æå© ãã§èª¬æããããã«ã圌ãã®æ¬åœã®åé¡ã¯ãç§ãã¡ã
ãªã¿ãŒã³ãš
ã¹ããŒã®æç€ºã䜿çšã§ããªãããšã§ãã 代ããã«ãããã°ã©ã ã®ããžãã¯ã¯ããã颿°ãå¥ã®é¢æ°ãåŒã³åºããšãã®å¯äœçšã®äœ¿çšã«åºã¥ããŠããŸãã
ã³ãŒã«ããã¯ã¯æ¬åœã«äžåãªããšãããŸãããããã°ã©ãã³ã°èšèªã§ã¯åœããåã ãšæãããŠããã¹ã¿ãã¯ã奪ããŸãã ã¹ã¿ãã¯ãªãã§ã³ãŒããæžãããšã¯ããã¬ãŒãããã«ãªãã§è»ãé転ãããããªãã®ã§ãã æ¬åœã«å¿
èŠã§ãé©åãªå Žæã«çœ®ããŸã§ããããã©ãã»ã©éèŠãã¯ããããŸããã
çŽæã®èŠç¹ã¯ãéåæãžã®ç§»è¡æã«å€±ãããèšèªã®åºæ¬ã§ãã
return ã
throw ãstackã
è¿ãããšã§ãã ãã ãããããããé«ãã¬ãã«ã«äžããã«ã¯ãPromiseã®äœ¿ç𿹿³ãç¥ã£ãŠããå¿
èŠããããŸãã
åå¿è
ã®ééã
誰ããçŽæ
ãæŒ«ç»ã®åœ¢ã§ããŸãã¯èšèã§èª¬æããããšããŠããŸã
ã ããã¯ã©ãã§ãäœæããã³éä¿¡ã§ãããã®ã§ãããéåæã§åä¿¡ããã³è¿ãããå€ã象城ããŸã ã
ãã®èª¬æãååã«åœ¹ç«ã€ãšã¯æããŸããã ç§ã«ãšã£ãŠãçŽæã¯åžžã«ã³ãŒãæ§é ããã®å®è¡ãããŒã®äžéšã§ãã
å°ããªäœè«ïŒç°ãªã人ã
ã«å¯ŸãããçŽæããšããçšèªã¯ãç°ãªãæå³ãæã£ãŠããŸãã ãã®èšäºã§ã¯ãææ°ã®ãã©ãŠã¶ãŒã§
window.PromiseãšããŠäœ¿çšã§ãã
å
¬åŒä»æ§ã«ã€ããŠ
説æããŸãã
window.Promiseãæããªããã©ãŠã¶ã®å Žåã仿§ã®æå°éã®å®è£
ãå«ããçææ°ãªåå
Lie ïŒfalseïŒãæã€é©åãªpolyfilããããŸãã
åå¿è
ã®ééãïŒ1-Promisesã®ãæªã®ãã©ãããã
APIãpromiseã«å€§ããçµã³ã€ããŠããPouchDBã®äœ¿ç𿹿³ãèŠããšãPouchDBã䜿çšããããã®æªããã¿ãŒã³ããããããããŸãã æãäžè¬çãªäŸã次ã«ç€ºããŸãã
remotedb.allDocs({ include_docs: true, attachments: true }).then(function (result) { var docs = result.rows; docs.forEach(function(element) { localdb.put(element.doc).then(function(response) { alert("Pulled doc with id " + element.doc._id + " and added to local db."); }).catch(function (err) { if (err.status == 409) { localdb.get(element.doc._id).then(function (resp) { localdb.remove(resp._id, resp._rev).then(function (resp) {
ã¯ããçŽæãã³ãŒã«ããã¯ã§ãããã®ããã«äœ¿çšã§ããããšãããããŸãããã¯ããå€§ç ²ããã¹ãºã¡ãæã€ã®ãšåãã§ãã
絶察çãªåå¿è
ã ãããã®ãããªééããç¯ããŠãããšæããªããç§ã¯ããªããé©ãããã§ããã-äžèšã®
ãµã³ãã«ã³ãŒãã¯
å
¬åŒã®BlackBerryéçºè
ããã°ããåãããŸãïŒ ã³ãŒã«ããã¯ã䜿çšãããšããå€ãç¿æ
£ãåãé€ãããšã¯å°é£ã§ãã
ããè¯ããªãã·ã§ã³ã¯æ¬¡ã®ãšããã§ãã
remotedb.allDocs(...) .then(function (resultOfAllDocs) { return localdb.put(...); }) .then(function (resultOfPut) { return localdb.get(...); }) .then(function (resultOfGet) { return localdb.put(...); }) .catch(function (err) { console.log(err); });
äžèšã®äŸã§ã¯ãè€åçŽæïŒå
ã®ãçŽæã®æ§æãïŒã䜿çšãããŸãã-çŽæã®é·æã®1ã€ã§ãã åŸç¶ã®å颿°ã¯ãåã®promiseãã解決ãããããšãã«åŒã³åºãããåã®promiseã®çµæãšãšãã«åŒã³åºãããŸãã 詳现ã¯ä»¥äžã«ãªããŸãã
åå¿è
ïŒ2ãšã©ãŒ-Promisesã§forEachïŒïŒã䜿çšããã«ã¯ã©ãããã°ããã§ããïŒ
ããã¯ãã»ãšãã©ã®äººãçŽæãçè§£ãå§ããç¬éã§ãã 圌ãã¯
forEach ã
forããŸãã¯
whileã€ãã¬ãŒã¿ã«ç²ŸéããŠããŸãããããããpromiseãšçµã¿åãããæ¹æ³ãããããŸããã æ¬¡ã«ããã®ãããªãã®ãçãŸããŸãïŒ
ãã®ã³ãŒãã®äœãåé¡ã«ãªã£ãŠããŸããïŒ åé¡ã¯ãæåã®é¢æ°ã
undefinedãè¿ãããšã§ããã€ãŸãã2çªç®ã®é¢æ°ã¯ããã¹ãŠã®ããã¥ã¡ã³ãã«ã€ããŠ
db.removeïŒïŒãå®äºãããŸã§åŸ
æ©ããŸããã å®éãããã¯äœãæåŸ
ãããä»»æã®æ°ã®ããã¥ã¡ã³ãããŸãã¯ãããã1ã€ã®ããã¥ã¡ã³ããåé€ããããšãã«å®è¡ãããŸãã
ããã¯éåžžã«æ²¹æã®ãªããªãééãã§ããç¹ã«ããã¥ã¡ã³ããã€ã³ã¿ãŒãã§ã€ã¹ãæŽæ°ããã®ã«ååãªéãã§åé€ãããŠããå Žåã¯ãæåã¯æ°ä»ããªããããããŸããã ãã°ã¯ããã¹ãŠã®ãã©ãŠã¶ã§ã¯ãªãããŸããªã±ãŒã¹ã§ã®ã¿çºçããå¯èœæ§ããããŸããã€ãŸãããã°ãç¹å®ããŠæé€ããããšã¯äºå®äžäžå¯èœã§ãã
èŠçŽãããšã
forEach ã
forãããã³
whileã®ãããªæ§é äœ
ã¯ã ãæ¢ããŠãããããŒã³ã§ã¯ãªãããšèšã
ãŸã ã
Promise.allïŒïŒãå¿
èŠ
ã§ã ïŒ
db.allDocs({include_docs: true}) .then(function (result) { var arrayOfPromises = result.rows.map(function (row) { return db.remove(row.doc); }); return Promise.all(arrayOfPromises); }) .then(function (arrayOfResults) {
ããã§äœãèµ·ãã£ãŠããŸããïŒ
Promise.allïŒïŒã¯ã
promiseã®é
åãåŒæ°ãšããŠåãããã¹ãŠã®ããã¥ã¡ã³ããåé€ãããå Žåã«ã®ã¿ã解決ããããæ°ãã
promisãè¿ããŸãã ããã¯
forã«ãŒãã«çžåœããéåæã§ãã
ãŸãã
Promise.allïŒïŒããã®
promiseã¯çµæã®é
åãæ¬¡ã®é¢æ°ã«æž¡ããŸããããã¯ãããšãã°ãããã¥ã¡ã³ããåé€ããã«è€æ°ã®ãœãŒã¹ããããŒã¿ãäžåºŠã«ååŸããå Žåã«éåžžã«äŸ¿å©ã§ãã
Promise.allïŒïŒã«æž¡ãããé
åããå°ãªããšã1ã€ã®promise
ã ããªãŒããŒã©ã€ãããããå Žåãçµæã®promiseã¯
æåŠç¶æ
ã«ãªããŸãã
åå¿è
ã®ééãïŒ3-.catchïŒïŒã®è¿œå ãå¿ãã
ãããããããééãã§ã-ããªãã®çŽæãæ±ºããŠãšã©ãŒãè¿ããªããšä¿¡ããããšã¯è³çŠã§ãã å€ãã®éçºè
ã¯ãåã«ã³ãŒãã®ã©ããã«
catchïŒïŒã远å ããããšãå¿ããŠããŸãã
æ®å¿µãªãããå€ãã®å Žåãããã¯ãšã©ãŒã飲ã¿èŸŒãŸããããšãæå³ããŸãã ããªãã¯ããããäœã§ãããããæ±ºããŠç¥ãããšã¯ãããŸãã-ã¢ããªã±ãŒã·ã§ã³ããããã°ãããšãã®ç¹å¥ãªçã¿ã
ãã®äžæå¿«ãªã·ããªãªãé¿ããããã«ãç§ã¯ãããã«ãŒã«ã«ããŸãããããã¯ç¿æ
£ã«å€ãããpromiseã®ãã§ãŒã³ã®æåŸã«åžžã«
catchïŒïŒã¡ãœããã远å ããŸããã
somePromise().then(function () { return anotherPromise(); }) .then(function () { return yetAnotherPromise(); })
ãšã©ãŒããŸã£ããçºçããªãããšãä¿èšŒãããŠããå Žåã§ãã
catchïŒïŒã远å ããããšã¯è³¢æãªãœãªã¥ãŒã·ã§ã³ã§ãã ãããããããçªç¶ããªãã®ééãã«ã€ããŠã®ä»®å®ãå®çŸããªããªããããªãã¯ããªãã«æè¬ãããšèšãã§ãããã
åå¿è
ïŒ4ãšã©ãŒ-é
å»¶ã®äœ¿çš
ç§ã¯ãã€ããã®ééããç®ã«ããŸããåãååã®æ ç»ã®
ããŒãã«ãžã¥ãŒã¹ã®ããã«ã䜿çšåæ°ãå¢ããã®ãåŸ
ã£ãŠããã®ã§ã¯ãªãããš
å¿é
ããŠããŸãã
èŠããã«ãçŽæã¯åœŒãã®éçºã«ãããŠé·ãéã®ããæ©ãã§ããŸããã JavaScriptã³ãã¥ããã£ã¯ãããããæ£ããå®è£
ããã®ã«é·ãæéãããããŸããã åœåãjQueryãšAngularã¯ããããå Žæã§é
å»¶ãªããžã§ã¯ããã¿ãŒã³ã䜿çšããŠããŸããããåŸã«ãè¯ããã©ã€ãã©ãªQãWhenãRSVPãBluebirdãLieãªã©ã«åºã¥ãES6 promises仿§ã«çœ®ãæããããŸããã
äžè¬ã«ãã³ãŒãå
ã§ãã®åèªãçªç¶æžããå ŽåïŒ3åç¹°ãè¿ããŸããïŒãäœãééã£ãããšãããŠããããšãããããŸãã ãããåé¿ããããã®ã¬ã·ããæ¬¡ã«ç€ºããŸãã
ã»ãšãã©ã®ãããã¹ã·ã§ãã«ã©ã€ãã©ãªã«ã¯ãä»ã®ã©ã€ãã©ãªãããããã¹ãã€ã³ããŒããããªãã·ã§ã³ããããŸãã ããšãã°ãAngularã®
$ qã¢ãžã¥ãŒã«ã䜿çšãããšã$ q以å€ã®ãããã¹ã
$ q.whenïŒïŒã§ã©ããã§ããŸãã ã€ãŸããAngularãŠãŒã¶ãŒã¯PouchDBããã®çŽæãæ¬¡ã®ããã«ã©ããã§ããŸãã
å¥ã®æ¹æ³ã¯ããªãªãžãã«ã§ãå
¬éã³ã³ã¹ãã©ã¯ã¿ãŒãã¿ãŒã³ãã䜿çšããããšã§ãã promiseã䜿çšããªãAPIãã©ããããã®ã«åœ¹ç«ã¡ãŸãã ããšãã°ãã³ãŒã«ããã¯ããŒã¹ã®Node.js APIãã©ããããã«ã¯ãæ¬¡ã®æäœãå®è¡ã§ããŸãã
new Promise(function (resolve, reject) { fs.readFile('myfile.txt', function (err, file) { if (err) { return reject(err); } resolve(file); }); }).then()
ã§ããïŒ ç§ãã¡ã¯ã²ã©ãå»¶æã«å¯ŸåŠããŸãã...ãããç§ã¯ã»ãšãã©3åèšã£ãïŒ :)
åå¿è
ã®ééãïŒ5-çµæãè¿ã代ããã«å€éšé¢æ°ã䜿çšãã
ãã®ã³ãŒãã®äœãåé¡ã«ãªã£ãŠããŸããïŒ
somePromise().then(function () { someOtherPromise(); }) .then(function () {
ããŠãä»ã¯çŽæã«ã€ããŠç¥ãå¿
èŠããããã¹ãŠã«ã€ããŠè©±ãçµ¶å¥œã®æ©äŒã§ãã
çå£ã«ãããã¯åãããªãã¯ã§ãããããçè§£ããããšã§ãããªããç§ãã¡ã話ãããã¹ãŠã®ééããé¿ããããšãã§ããŸãã æºåã¯ããã§ãã
å
ã»ã©è¿°ã¹ãããã«ãçŽæã®éæ³ã¯ã貎éãª
ãªã¿ãŒã³ãš
ã¹ããŒãè¿ãããšã§ãã ããããããã¯å®éã«ã¯ã©ãããæå³ã§ããïŒ
åpromiseã¯ã
thenïŒïŒã¡ãœãããæäŸããŸãïŒããã«
catchïŒïŒãå®éã«ã¯
thenïŒnullã...ïŒã® ãç ç³ãã§ãïŒã ãããŠã
thenïŒïŒé¢æ°ã®äžã«ããŸãïŒ
somePromise().then(function () {
ããã§äœãã§ããŸããïŒ 3ã€ã®ããšïŒ
- å¥ã®çŽæãè¿ã
- åæå€ïŒãŸãã¯undefined ïŒãè¿ããŸã
- åæãšã©ãŒãã¹ããŒãã
ããããã¹ãŠãå
šäœã®ããªãã¯ã§ãã ãããçè§£ãã-çŽæãçè§£ããã æ¬¡ã«ãåã¢ã€ãã ã詳现ã«åæããŸãã
1.å¥ã®çŽæãè¿ã
ããã¯ãäžèšã®è€åãããã¹ã®äŸãšåæ§ã«ããããã¹ã«é¢ããããããçš®é¡ã®æç®ã§èŠãããšãã§ããäžè¬çãªãã¿ãŒã³ã§ãã
getUserByName('nolan').then(function (user) {
returnã䜿çšããŠ2çªç®ã®promiseãæ£ç¢ºã«è¿ãããšã«æ³šæããŠãã ããã ããã§
returnã䜿çš
ããããšãéèŠã§ãã
getUserAccountByIdãåŒã³åºããå Žåãã¯ãããŠãŒã¶ãŒããŒã¿ã®ãªã¯ãšã¹ãããããã©ãã§ã圹ã«ç«ããªãçµæãåŸãããŸããæ¬¡ã®çµæã¯ãç®çã®
userAccountã§ã¯ãªã
undefinedã«ãªããŸãã
2.åæå€ãè¿ããŸãïŒãŸãã¯æªå®çŸ©ïŒ
çµæãšããŠ
æªå®çŸ©ãè¿ãããšã¯ããããééãã§ãã ãã ããåæå€ãè¿ãããšã¯ãåæã³ãŒããPromiseã®ãã§ãŒã³ã«å€æããããã®åªããæ¹æ³ã§ãã ã¡ã¢ãªã«ãŠãŒã¶ãŒããŒã¿ã®ãã£ãã·ã¥ããããšããŸãã ã§ããããšïŒ
getUserByName('nolan').then(function (user) { if (inMemoryCache[user.id]) {
ãã£ãããã§ããã ãã§ãŒã³ã®2çªç®ã®é¢æ°ã¯ãããŒã¿ãã©ãããæ¥ãã®ãããã£ãã·ã¥ããããŸãã¯ãªã¯ãšã¹ãã®çµæãšããŠãé¢ä¿ãªããæåã®é¢æ°ã¯ããã«åæå€ãŸãã¯éåæãããã¹ãèªç±ã«è¿ãããšãã§ããŸãã
æ®å¿µãªããã
returnã䜿çšããªãã£ãå Žåã颿°ã¯å€ãè¿ããŸããããã¹ãããã颿°ãåŒã³åºããçµæã§ã¯ãªãããã®ãããªå Žåã«ããã©ã«ãã§è¿ãããç¡çšãª
undefinedã«ãªããŸãã
ç§èªèº«ã®ããã«ãã«ãŒã«ãå°å
¥ããŸããããã®ã«ãŒã«ã¯ç¿æ
£ã«ãªããŸãããåžžã«å
éšã§
returnã䜿çšãããã
throwã䜿çšã
ãŠãšã©ãŒã
ã¹ããŒããŸãã åãããšããå§ãããŸãã
3.åæãšã©ãŒãã¹ããŒãã
ã ããç§ãã¡ã¯
æãã«è¡ããŸããã ããã§ãçŽæã¯ããã«æãããªãå§ããŸãã ãŠãŒã¶ãŒããã°ã€ã³ããŠããªãå Žåã«åæãšã©ãŒã
ã¹ããŒãããšããŸãã ç°¡åã§ãïŒ
getUserByName('nolan').then(function (user) { if (user.isLoggedOut()) {
catchïŒïŒã¯ããŠãŒã¶ãŒãèªèšŒãããŠããªãå Žåã¯åæãšã©ãŒãåãåããäžèšã®çŽæã®ããããã
æåŠç¶æ
ã«ãªããšéåæãšã©ãŒãåãåããŸãã ç¹°ãè¿ããŸããããšã©ãŒãåæçãéåæçãã«é¢ä¿ãªãã颿°ã¯
ãã£ããããŸãã
ããã¯ãéçºäžã«ãšã©ãŒããã£ããããã®ã«ç¹ã«åœ¹ç«ã¡ãŸãã ããšãã°ã
JSONãç¡å¹ãªå Žåã
JSON.parseïŒïŒã䜿çšããŠ
thenïŒïŒã®å
éšã®ã©ããã«ããæååãããªããžã§ã¯ããæ§ç¯ãããšããšã©ãŒãã¹ããŒãããå Žå
ããããŸãã ã³ãŒã«ããã¯ã§ã¯ãããã¯é£²ã¿èŸŒãŸããŸããã
catchïŒïŒã¡ãœããã䜿çšãããšãç°¡åã«åŠçã§ããŸãã
é«åºŠãªãã°
ããŠãããªãã¯çŽæã®äž»ãªããªãã¯ãåŠãã ã®ã§ã極端ãªã±ãŒã¹ã«ã€ããŠè©±ããŸãããã åžžã«æ¥µç«¯ãªã±ãŒã¹ãããããã§ãã
ããã°ã©ããŒã®çŽæã«ç²ŸéããŠããã³ãŒãã§ã®ã¿ãšã©ãŒã«åºäŒã£ãããããã®ã«ããŽãªã®ãšã©ãŒããé«åºŠããšåŒã³ãŸãã ãã®èšäºã®åé ã§å
¬éããåé¡ãè§£æããã«ã¯ããã®ãããªãšã©ãŒã«ã€ããŠè°è«ããå¿
èŠããããŸãã
é«åºŠãªãšã©ãŒçªå·1-Promise.resolveïŒïŒãããããªã
éåæã³ãŒãã§åæããžãã¯ãã©ãããããšãã®çŽæãã©ãã»ã©äŸ¿å©ãã¯ãã§ã«äžã§ç€ºããŸããã åæ§ã®ããšã«æ°ã¥ãããããããŸããïŒ
new Promise(function (resolve, reject) { resolve(someSynchronousValue); }).then();
åãããšããã£ãšçãæžãããšãã§ããããšã«çæããŠãã ããïŒ
Promise.resolve(someSynchronousValue).then();
ãŸãããã®ã¢ãããŒãã¯ãåæãšã©ãŒããã£ããããã®ã«éåžžã«äŸ¿å©ã§ãã ãšãŠã䟿å©ãªã®ã§ãçŽæãè¿ãã»ãšãã©ãã¹ãŠã®APIã¡ãœããã§äœ¿çšããŸãã
function somePromiseAPI() { return Promise.resolve() .then(function () { doSomethingThatMayThrow(); return 'foo'; }) .then(); }
åæãšã©ãŒãã¹ããŒããå¯èœæ§ã®ããã³ãŒãã¯ãã飲ã¿èŸŒãŸããããšã©ãŒã«ããæœåšçãªãããã°åé¡ã§ããããšãèŠããŠãããŠãã ããã ãããã
Promise.resolveïŒïŒã§ã©ãããããšã
catchïŒïŒã§ç¢ºå®ã«ãã£ããã§ããŸãã
ãŸã
Promise.rejectïŒïŒããããŸãã
æåŠã¹ããŒã¿ã¹ã®ãããã¹ãè¿ãããã«äœ¿çšã§ããŸãïŒ
Promise.reject(new Error('- '));
é«åºŠãªãšã©ãŒïŒ2-catchïŒïŒã¯thenãšåãã§ã¯ãããŸããïŒnullã...ïŒ
å°ãåã«ã
catchïŒïŒã¯åãªããç ç³ãã§ãããšè¿°ã¹ãŸããã 以äžã®2ã€ã®äŸã¯åçã§ãã
somePromise().catch(function (err) {
ãã ãã以äžã®äŸã¯ãã¯ããåçãã§ã¯ãããŸããã
somePromise().then(function () { return someOtherPromise(); }) .catch(function (err) {
äžèšã®äŸããªããçãããªããã®ãçåã«æã£ãããæåã®é¢æ°ã§ãšã©ãŒãçºçããå Žåã«äœãèµ·ããããæ³šææ·±ãèŠãŠãã ããã
somePromise().then(function () { throw new Error('oh noes'); }) .catch(function (err) {
format
thenïŒresolveHandlerãrejectHandlerïŒã䜿çšãããšãå®éã«ã¯
rejectHandlerã¯
resolveHandler颿°å
ã§çºçãããšã©ãŒããã£ããã§ããªãããšã
ããããŸãã
ãã®æ©èœãç¥ã£ãŠã
thenïŒïŒã¡ãœããã§2çªç®ã®é¢æ°ã決ããŠäœ¿çšããã代ããã«åžžã«
catchïŒïŒã®åœ¢åŒã§ãšã©ãŒåŠçã远å ããã«ãŒã«ãå°å
¥ããŸããã äŸå€ã1ã€ã ããããŸããMochaã§ã®éåæãã¹ãã§ããæå³çã«ãšã©ãŒãåŸ
ã€å Žåã§ãã
it('should throw an error', function () { return doSomethingThatThrows().then(function () { throw new Error('I expected an error!'); }, function (err) { should.exist(err); }); });
ãšããã§ã
Mochaãš
Chaiã¯ãPromiseããŒã¹ã®APIããã¹ãããããã®çŽ æŽãããçµã¿åããã§ãã
é«åºŠãªééãïŒ3-çŽæãšçŽæã®å·¥å Ž
äžé£ã®çŽæãé çªã«å®äºããããšããŸãã
Promise.allïŒïŒã®ãããªãã®ãå¿
èŠã§ããã
promiseã䞊è¡ããŠå®è¡
ããªããã®ã
å¿
èŠã§ãã
ãããŸã§ã®éãæ¬¡ã®ããã«èšè¿°ã§ããŸãã
function executeSequentially(promises) { var result = Promise.resolve(); promises.forEach(function (promise) { result = result.then(promise); }); return result; }
æ®å¿µãªãããäžèšã®äŸã¯æå³ãããšããã«ã¯æ©èœããŸããã
executeSequentiallyïŒïŒã«æž¡ããããªã¹ãã®
Promiseã¯ãåŒãç¶ã䞊åå®è¡ãéå§ããŸãã
ãã®çç±ã¯ã仿§ã«ãããšãpromiseã¯äœæåŸããã«åã蟌ãŸããããžãã¯ã®å®è¡ãéå§ããããã§ãã 圌ã¯åŸ
ã¡ãŸããã ãããã£ãŠãpromiseèªäœã§ã¯ãªããpromiseãã¡ã¯ããªã®é
åã
executeSequentiallyã«æž¡ãå¿
èŠããããã®ã§ãã
function executeSequentially(promiseFactories) { var result = Promise.resolve(); promiseFactories.forEach(function (promiseFactory) { result = result.then(promiseFactory); }); return result; }
ããªãã¯ä»ã
ããã®Javaããã°ã©ãã¯äžäœäœè
ãªã®ãããããŠãªã圌ãç§ãã¡ã«å·¥å Žã«ã€ããŠèªã£ãŠããã®ãããšèããŠããã®ãç¥ã£ãŠã
ãŸãã å®éããã¡ã¯ããªãŒã¯ãããã¹ãè¿ãåçŽãªé¢æ°ã§ãã
function myPromiseFactory() { return somethingThatCreatesAPromise(); }
ãã®äŸãæ©èœããã®ã¯ãªãã§ããïŒ ããããç§ãã¡ã®å·¥å Žã¯åœŒã«é çªãæ¥ããŸã§çŽæãäœæããªãããã§ãã
thenïŒïŒã® resolveHandlerãšãŸã£ããåãããã«
æ©èœããŸãã
颿°
executeSequentiallyïŒïŒãæ³šææ·±ãèŠãŠã
promiseFactoryãžã®ãªã³ã¯ããã®ã³ã³ãã³ãã§
ã¡ã³ã¿ã«ã«çœ®ãæããŸã-ããã§ãã©ã€ããé ã®äžã§æ¥œããç¹æ»
ããŸã:)
é«åºŠãªééãïŒ4-2ã€ã®çŽæã®çµæãå¿
èŠãªå Žåã¯ã©ãããã°ããã§ããïŒ
ããçŽæãå¥ã®çŽæã«äŸåããããšããããããæåŸã«ã¯äž¡æ¹ã®çµæãå¿
èŠã§ãã äŸïŒ
getUserByName('nolan').then(function (user) { return getUserAccountById(user.id); }) .then(function (userAccount) {
åªããJavaScriptéçºè
ã§ããç¶ããããã«ããæªã®ãã©ãããããäœæãããªãããã«ã
ãŠãŒã¶ãŒå€æ°ãããé«ãã¬ãã«ã®å¯èŠæ§ã«ãããå Žåããã
ãŸã ã
var user; getUserByName('nolan').then(function (result) { user = result; return getUserAccountById(user.id); }) .then(function (userAccount) {
ããã¯æ©èœããŸãããå人çã«ã¯ã³ãŒãããã¹ãããã³ã°ãããŠãããšæããŸãã ç§ã®æ±ºæã¯åèŠãæšãŠãããã©ããããã«åããŠæèçãªäžæ©ãèžã¿åºãããšã§ãã
getUserByName('nolan').then(function (user) { return getUserAccountById(user.id) .then(function (userAccount) {
...å°ãªããšãäžæçãªã¹ãããã ã€ã³ãã³ããå¢å ãããã©ããããè
ããããŠæé·ãå§ããŠãããšæããå Žåã¯ãJavaScriptéçºè
ãäœäžçŽã«ãããã£ãŠè¡ã£ãŠããããšãå®è¡ããŸãã颿°ãäœæããååã§äœ¿çšããŸãã
function onGetUserAndUserAccount(user, userAccount) { return doSomething(user, userAccount); } function onGetUser(user) { return getUserAccountById(user.id) .then(function (userAccount) { return onGetUserAndUserAccount(user, userAccount); }); } getUserByName('nolan') .then(onGetUser) .then(function () {
ã³ãŒããè€éã«ãªããšããã®ã»ãšãã©ãååä»ã颿°ã«å€æãããã¢ããªã±ãŒã·ã§ã³ããžãã¯èªäœãçŸçãªåã³ããããã圢ã«ãªãå§ããããšãããããŸãã
putYourRightFootIn() .then(putYourRightFootOut) .then(putYourRightFootIn) .then(shakeItAllAbout);
ãããç§ãã¡ã®çŽæã§ãã
é«åºŠãªééã5-çŽæãç Žã
, , . . , . , .
, ?
Promise.resolve('foo') .then(Promise.resolve('bar')) .then(function (result) { console.log(result); });
, bar, . foo!
, ,
then() - (, ),
then(null) «» . :
Promise.resolve('foo') .then(null) .then(function (result) { console.log(result); });
then(null) , â foo.
. . ,
then() , , .
then() . , - :
Promise.resolve('foo') .then(function () { return Promise.resolve('bar'); }) .then(function (result) { console.log(result); });
bar, .
:
then() .
, , , , , .
.
â1
doSomething().then(function () { return doSomethingElse(); }) .then(finalHandler);
çãã¯ïŒ
doSomething |-----------------| doSomethingElse(undefined) |------------------| finalHandler(resultOfDoSomethingElse) |------------------|
â2
doSomething().then(function () { doSomethingElse(); }) .then(finalHandler);
çãã¯ïŒ
doSomething |-----------------| doSomethingElse(undefined) |------------------| finalHandler(undefined) |------------------|
â3
doSomething().then(doSomethingElse()) .then(finalHandler);
çãã¯ïŒ
doSomething |-----------------| doSomethingElse(undefined) |---------------------------------| finalHandler(resultOfDoSomething) |------------------|
â4
doSomething().then(doSomethingElse) .then(finalHandler);
çãã¯ïŒ
doSomething |-----------------| doSomethingElse(resultOfDoSomething) |------------------| finalHandler(resultOfDoSomethingElse) |------------------|
, ,
doSomething() doSomethingElse() , . , - .
.
. , . , , , .
, - â
PounchDB map/reduce . : 290 , 555 . -, ⊠. .
, . , . , , . , - , . , , . . , , , , .
async/await
«
ES7 »
async/await , . - (
catch() ,
try/catch , , ES7
try/catch/return .
JavaScript, , - - , .
JavaScript, ,
JSLint JSHint , «
JavaScript », . , , , , .
async/await , JS, - - . , , ES5 ES6.
« JavaScript», . , :
â !