
node.jsã§æžãå§ãããšãã2ã€ã®ããšãå«ã£ãŠããŸããããã¹ãŠã®äžè¬çãªãã³ãã¬ãŒããšã³ãžã³ãšèšå€§ãªæ°ã®ã³ãŒã«ããã¯ã§ãã ã€ãã³ãæåãµãŒããŒã®å
šæ©èœãç解ããŠãããããã³ãŒã«ããã¯ãèªçºçã«äœ¿çšããŸãããããã以æ¥
ãžã§ãã¬ãŒã¿ãŒãJavaScriptã«ç»å Žããå®è£
ãããæ¥ã楜ãã¿ã«ããŠããŸãã
ãããŠä»ããã®æ¥ãæ¥ãŠããŸãã çŸåšããžã§ãã¬ãŒã¿ãŒ
ã¯V8ããã³SpiderMonkeyã§
å©çšã§ã ãå®è£
ã¯ä»æ§ã®æŽæ°ã«åŸã£ãŠããŸã-ããã¯æ°ããæ代ã®å¹éãã§ãïŒ
V8ã¯ããžã§ãã¬ãŒã¿ãŒãªã©ã®æ°ããHarmonyæ©èœãã³ãã³ãã©ã€ã³ãã©ã°ã®åŸãã«é ããŸãããããã¯ãã°ããã®éã§ãã ãã¹ãŠã®ãã©ãŠã¶ãŒã§äœ¿çšå¯èœã«ãªãåã«ããžã§ãã¬ãŒã¿ãŒã䜿çšããŠéåæã³ãŒããäœæããæ¹æ³ãåŠç¿ã§ããŸãã ãããã®ã¢ãããŒããæ©ãã«è©ŠããŠã¿ãŸãããã
次ã®å®å®ããŒãžã§ã³ãšãªã
ããŒã0.11ã®äžå®å®ããŒãžã§ã³ãããŠã³ããŒãããããšã§ãä»æ¥äœ¿çšã§ããŸãã ããŒããéå§ãããšãã«ã
--harmony
ãŸãã¯
--harmony-generators
ãã©ã°ã
--harmony-generators
ãŸãã
ã§ã¯ããžã§ãã¬ãŒã¿ãŒã䜿çšããŠã³ãŒã«ããã¯å°çããã©ã®ããã«æãã®ã§ããããïŒ ãžã§ãã¬ãŒã¿ãŒé¢æ°ã¯ã
yield
ã䜿çšããŠå®è¡ãäžæåæ¢ããåéãŸãã¯äžæåæ¢ãããšãã«çµæãå
¥åºåããŸãã ãã®ããã«ããŠãé¢æ°ãã³ãŒã«ããã¯ãæž¡ããã«å¥ã®é¢æ°ã®çµæãåŸ
ã€ãšãã«äžæåæ¢ã§ããŸãã
ç§ãã¡ã®èšèªã§èšèªæ§æã説æããããšãããšãé¢çœããªãã§ããïŒ ã³ãŒãã«é£ã³èŸŒãã®ã¯ã©ãã§ããïŒ
ãžã§ãã¬ãŒã¿ãŒã®åºæ¬
éåæã®äžçã«é£ã³èŸŒãåã«ãããªããã£ããžã§ãã¬ãŒã¿ãŒãèŠãŠã¿ãŸãããã ãžã§ãã¬ãŒã¿ãŒã¯
function*
宣èšãã
function*
ïŒ
function* foo(x) { yield x + 1; var y = yield null; return x + y; }
次ã«åŒã³åºãã®äŸã瀺ããŸãã
var gen = foo(5); gen.next();
ã¯ã©ã¹ã§ã¡ã¢ãåã£ãå Žåã次ã®ããã«æžããŸãã
yield
ãã¹ãŠã®åŒã§èš±å¯ãããŸãã- ãžã§ãã¬ãŒã¿ãŒåŒã³åºãã¯éåžžã®é¢æ°ãšåãã§ããããžã§ãã¬ãŒã¿ãŒãªããžã§ã¯ããäœæããŸãã ãžã§ãã¬ãŒã¿ãåéããã«ã¯ã
next
ãåŒã³åºããã send
ããå¿
èŠããããŸãã send
ãå€ãéãè¿ããšãã«äœ¿çšãããŸãã gen.next()
gen.send(null)
gen.next()
åçã§ãã ãžã§ãã¬ãŒã¿ãŒå
ã§äŸå€ãã¹ããŒããgen.throw
ããããŸãã - ãžã§ãã¬ãŒã¿ãŒã¡ãœããã¯ãçŽç²ãªå
ã®å€ã§ã¯ãªãã
value
ãšdone
2ã€ã®ãã©ã¡ãŒã¿ãŒãæã€ãªããžã§ã¯ããè¿ããŸãã done
ãããã§ãå€ãAPIã«ãã£ãäžäŸ¿ãªStopIteration
äŸå€ã®ä»£ããã«ã return
ãŸãã¯é¢æ°ã®åçŽãªçµäºã®ããããã§ãžã§ãã¬ãŒã¿ãŒãçµäºããããšãæããã«ãªããŸãã
éåæãœãªã¥ãŒã·ã§ã³ïŒ1ïŒäžæåæ¢
ã©ã®ã³ãŒã«ããã¯å°çã®ã³ãŒããã©ããããïŒ ããŠãé¢æ°ãä»»æã«äžæåæ¢ã§ããå Žåã éåæã³ãŒã«ããã¯ã³ãŒããã·ã¥ã¬ãŒãã³ç²ã§åæçã«èŠããã³ãŒãã«æ»ãããšãã§ããŸãã
質åïŒç ç³ãšã¯äœã§ããïŒ
æåã®è§£æ±ºçã¯ã
ãµã¹ãã³ãã©ã€ãã©ãªã§ææ¡ãããŠããŸãã ãšãŠãç°¡åã§ãã æ·±å»ãªã®
ã¯ãããã
16è¡ã®ã³ãŒãã§ãã
ããã¯ããã®ã©ã€ãã©ãªã§ã®ã³ãŒãã®å€èŠ³ã§ãã
var suspend = require('suspend'), fs = require('fs'); suspend(function*(resume) { var data = yield fs.readFile(__filename, 'utf8', resume); if(data[0]) { throw data[0]; } console.log(data[1]); })();
suspend
é¢æ°ã¯ããžã§ãã¬ãŒã¿ãŒãèµ·åããéåžžã®é¢æ°ã«ãžã§ãã¬ãŒã¿ãŒãæž¡ããŸãã
resume
é¢æ°ããžã§ãã¬ãŒã¿ã«æž¡ããŸãã
resume
é¢æ°ã¯ãã¹ãŠã®éåæåŒã³åºãã®ã³ãŒã«ããã¯ãšããŠäœ¿çšããå¿
èŠãããããšã©ãŒãšå€ã®ãã©ã°ãå«ãåŒæ°ã§ãžã§ãã¬ãŒã¿ãåéããŸãã
resume
ãšãžã§ãã¬ãŒã¿ãŒã®ãã³ã¹ã¯èå³æ·±ãã§ãããããã€ãã®æ¬ ç¹ããããŸãã 第äžã«ãè¿ããã2èŠçŽ é
åã¯ãæ§é åïŒ
var [err, res] = yield foo(resume)
ïŒããŠãäžäŸ¿ã§ãã å€ã®ã¿ãè¿ãããšã©ãŒãããå Žåã¯äŸå€ãšããŠã¹ããŒããŸãã å®éãã©ã€ãã©ãªã¯ããããµããŒãããŠããŸããããªãã·ã§ã³ãšããŠããããããã©ã«ãã§ããã¹ãã ãšæããŸãã
第äºã«ãåžžã«æ瀺çã«å±¥æŽæžãæž¡ãã®ã¯äžäŸ¿ã§ãããããã«ãäžèšã®æ©èœãå®äºãããŸã§åŸ
ã€ãšäžé©åã§ãã ãããŠãéåžžã¯ããŒãã§è¡ãããããã«ã
callback
ãè¿œå ããŠãé¢æ°ã®æåŸã«åŒã³åºãå¿
èŠããããŸãã
æåŸã«ãããšãã°è€æ°ã®åæåŒã³åºãã§ãããè€éãªå®è¡ã¹ã¬ããã䜿çšããããšã¯ã§ããŸããã
README㯠ãä»ã®ãããŒå¶åŸ¡ã©ã€ãã©ãªããã§ã«ãã®åé¡ã解決ããŠãããšäž»åŒµããŠããŸãã
suspend
ãšãããã®ããããã䜿çš
suspend
å¿
èŠããããŸããããžã§ãã¬ãŒã¿ãŒãµããŒããå«ããããŒå¶åŸ¡ã©ã€ãã©ãªãå¿
èŠã§ãã
èè
ããã®è¿œå ïŒ kriskowalã¯
creationixã«ãã£ãŠæžããã
ãã®èŠç¹ãææ¡ããŸãããã³ãŒã«ããã¯ããŒã¹ã®ã³ãŒãçšã«æ¹åãããã¹ã¿ã³ãã¢ãã³ãžã§ãã¬ãŒã¿ãŒãã³ãã©ãŒããããŸãã ããã©ã«ãã§ãšã©ãŒãã¹ããŒããã®ã¯ãšãŠãã¯ãŒã«ã§ãã
éåæãœãªã¥ãŒã·ã§ã³ïŒ2ïŒçŽæ
éåæã®å®è¡ã¹ã¬ãããå¶åŸ¡ããããèå³æ·±ãæ¹æ³ã¯ãpromiseã䜿çšãã
ããšã§ãã Promiseã¯ãå°æ¥ã®äŸ¡å€ãè¡šããªããžã§ã¯ãã§ãããéåæåäœãè¡šãããã°ã©ã ã«ããå®è¡ã®åŒã³åºãã¹ã¬ããã«PromiseãæäŸã§ããŸãã
ããã§çŽæã説æããŸãããæéãããããããŸãããŸãããã§ã«
è¯ã説æããããŸãã æè¿ãã©ã€ãã©ãªéçžäºäœçšã®æ¯ãèããšAPIçŽæã®å®çŸ©ã«éç¹ã眮ãããŠããŸããããã®èãæ¹ã¯éåžžã«åçŽã§ãã
äºåãžã§ãã¬ãŒã¿ãŒã®ãµããŒããæ¢ã«ããããŸãéåžžã«æçããŠãããããçŽæã®ããã«
Qã©ã€ãã©ãªãŒã䜿çšããŸãã
task.jsã¯ãã®ã¢ã€ãã¢ã®åæã®å®è£
ã§ãããã
promiseã®éæšæºã®å®è£
ããããŸããã
äžæ©åŸéããŠãå®éã®äŸãèŠãŠã¿ãŸãããã å€ãã®å ŽåãåçŽãªäŸã䜿çšããŸãã ãã®ã³ãŒãã¯ãã¡ãã»ãŒãžãäœæããŠããåä¿¡ããåãã¿ã°ã䜿çšããŠã¡ãã»ãŒãžãåä¿¡ããŸãïŒ
client
ã¯redisã®ã€ã³ã¹ã¿ã³ã¹ã§ãïŒïŒ
client.hmset('blog::post', { date: '20130605', title: 'g3n3rat0rs r0ck', tags: 'js,node' }, function(err, res) { if(err) throw err; client.hgetall('blog::post', function(err, post) { if(err) throw err; var tags = post.tags.split(','); var posts = []; tags.forEach(function(tag) { client.hgetall('post::tag::' + tag, function(err, taggedPost) { if(err) throw err; posts.push(taggedPost); if(posts.length == tags.length) {
ãã®äŸã®èŠèŠããã芧ãã ããïŒ ã³ãŒã«ããã¯ã¯ãç»é¢ã®å³åŽã«ããã³ãŒãããã°ããæŒããŸãã ããã«ããã¹ãŠã®ã¿ã°ããªã¯ãšã¹ãããã«ã¯ãåãªã¯ãšã¹ããæåã§ç®¡çãããã¹ãŠã®ã¿ã°ãæºåã§ããããšã確èªããå¿
èŠããããŸãã
ãã®ã³ãŒãã
Q promiseã«æã¡èŸŒããã
var db = { get: Q.nbind(client.get, client), set: Q.nbind(client.set, client), hmset: Q.nbind(client.hmset, client), hgetall: Q.nbind(client.hgetall, client) }; db.hmset('blog::post', { date: '20130605', title: 'g3n3rat0rs r0ck', tags: 'js,node' }).then(function() { return db.hgetall('blog::post'); }).then(function(post) { var tags = post.tags.split(','); return Q.all(tags.map(function(tag) { return db.hgetall('blog::tag::' + tag); })).then(function(taggedPosts) {
redisé¢æ°ãã©ããããå¿
èŠããã£ããããã³ãŒã«ããã¯ããŒã¹ããããã¹ããŒã¹ã«å€ããŸãããããã¯ç°¡åã§ãã promiseãååŸãããããã«
then
ãåŒã³åºããŠãéåææäœã®çµæãåŸ
ã¡ãŸãã 詳现ã«ã€ããŠã¯
ãpromises / A +ä»æ§ã§èª¬æãã
ãŠããŸãã
Q
ã¯ã
all
ãªã©ã®ããã€ãã®è¿œå ã¡ãœãããå®è£
ããŸãããããã¹ã®é
åãåãåãããããããå®äºãããŸã§åŸ
æ©ããŸãã ããã«ã
done
ããããŸããããã¯ãéåæããã»ã¹ãå®äºããæªåŠçã®ãšã©ãŒãã¹ããŒãããããšã瀺ããŠããŸãã promises / A +ä»æ§ã«ãããšããã¹ãŠã®äŸå€ã¯ãšã©ãŒã«å€æããããšã©ãŒãã³ãã©ãŒã«æž¡ãããå¿
èŠããããŸãã ãããã£ãŠããšã©ãŒããªãå Žåããã¹ãŠã®ãšã©ãŒã確å®ã«ã¹ããŒãããŸãã ïŒäžæãªç¹ãããå Žåã¯ããããã¯ã®
ãã®èšäºãã
èªã¿ãã ãããïŒ
æçµçãªçŽæã®æ·±ãã«æ³šç®ããŠãã ããã ããã¯ãæåã«
post
ã«ã¢ã¯ã»ã¹ãã次ã«
taggedPosts
ã¢ã¯ã»ã¹ããå¿
èŠããããã
taggedPosts
ã ã³ãŒã«ããã¯ã¹ã¿ã€ã«ã®ã³ãŒããããã§æããããè¿·æã§ãã
ä»ãããçºé»æ©ã®èœåãè©äŸ¡ãããšãã§ãã
Q.async(function*() { yield db.hmset('blog::post', { date: '20130605', title: 'g3n3rat0rs r0ck', tags: 'js,node' }); var post = yield db.hgetall('blog::post'); var tags = post.tags.split(','); var taggedPosts = yield Q.all(tags.map(function(tag) { return db.hgetall('blog::tag::' + tag); }));
ããã¯çŽ æŽãããããšã§ã¯ãããŸãããïŒ ããã¯å®éã«ã©ã®ããã«èµ·ãããŸããïŒ
Q.async
ã¯ããžã§ãã¬ãŒã¿ãŒã
Q.async
ããµã¹ãã³ãã©ã€ãã©ãªãšåæ§ã«ããžã§ãã¬ãŒã¿ãŒãå¶åŸ¡ããé¢æ°ãè¿ããŸãã ãã ããããã§ã®éèŠãªéãã¯ããžã§ãã¬ãŒã¿ãŒããããã¹ãäžããïŒè²ãïŒããšã§ãã Qã¯ãã¹ãŠã®çŽæãåãå
¥ãããžã§ãã¬ãŒã¿ãŒãããã«é¢é£ä»ããçŽæãæºãããããšåéããçµæãéãè¿ããŸãã
åä»ãª
resume
æ©èœã管çããå¿
èŠã¯ãããŸãããPromisesã¯å®å
šã«ãããåŠçãã
Promisesåäœã®å©ç¹ã掻çš
ããŸãã
å©ç¹ã®1ã€ã¯ãå¿
èŠã«å¿ããŠç°ãªãQãããã¹ã䜿çšã§ããããšã§ããããšãã°ãããã€ãã®éåææäœã䞊è¡ããŠå®è¡ãã
Q.all
ã§ãã ãã®æ¹æ³ã«ããããžã§ãã¬ãŒã¿ãŒã§åæ§ã®Q Promiseãšæé»çãªPromiseãç°¡åã«çµã¿åãããŠãéåžžã«ãããã«èŠããè€éãªå®è¡ã¹ã¬ãããäœæã§ããŸãã
ãŸãããã¹ãã®åé¡ã¯ãŸã£ãããããŸããã
post
ãš
taggedPosts
ã¯åãã¹ã³ãŒãã«çãŸãããã
taggedPosts
ã§ã¹ã³ãŒãã®ãã§ãŒã³ãå£ããå¿é
ã¯ãããããŸããã
ãšã©ãŒåŠçã¯éåžžã«é£ããããããžã§ãã¬ãŒã¿ãŒã§ãããã¹ã䜿çšããåã«ãããã¹ãã©ã®ããã«æ©èœããããæ¬åœã«ç解ããå¿
èŠããããŸãã promiseã®ãšã©ãŒãšäŸå€ã¯åžžã«ãšã©ãŒåŠçé¢æ°ã«æž¡ãããäŸå€ãã¹ããŒããããšã¯ãããŸããã
async
ãžã§ãã¬ãŒã¿ãŒã¯ãã¹ãŠäŸå€ã§ã¯ãããŸããã ãšã©ãŒã³ãŒã«ããã¯ïŒ
someGenerator().then(null, function(err) { ... })
ãšã©ãŒã管çã§ããŸãã
ãã ãããžã§ãã¬ãŒã¿ãŒpromisesã«ã¯ç¹å¥ãªåäœããããŸããã€ãŸãããžã§ãã¬ãŒã¿ãŒãäžæããããã€ã³ããé€ããç¹å¥ãª
gen.throw
ã¡ãœããã䜿çšããŠãžã§ãã¬ãŒã¿ãŒã«ã¹ããŒããã
gen.throw
ããã®ãšã©ãŒã¯ã¹ããŒãããŸãã ã€ãŸãã
try/catch
ã䜿çšããŠãžã§ãã¬ãŒã¿ãŒã®ãšã©ãŒãåŠçã§ããŸãã
Q.async(function*() { try { var post = yield db.hgetall('blog::post'); var tags = post.tags.split(','); var taggedPosts = yield Q.all(tags.map(function(tag) { return db.hgetall('blog::tag::' + tag); }));
ããã¯æåŸ
ã©ããã«æ©èœããŸã
db.hgetall
åŒã³åºãããã®ãšã©ãŒã¯ã
Q.all
å
ã®æ·±ãçŽæã®ãšã©ãŒã§ãã£ãŠãã
catch
ãã³ãã©ã§åŠçãããŸãã
try/catch
ãªããã°
try/catch
äŸå€ã¯ãããã¹ã®åŒã³åºãå
ã®ãšã©ãŒãã³ãã©ãŒã«æž¡ãããŸãïŒåŒã³åºãå
ãããªãå Žåããšã©ãŒã¯æå¶ãããŸãïŒã
èããŠã¿ãŠãã ãã-
éåæã³ãŒãã®try / catchã§äŸå€ãã³ãã©ãŒãã€ã³ã¹ããŒã«ã§ããŸãã ãšã©ãŒãã³ãã©ã®åçã¹ã³ãŒãã¯æ£ãããã®ã«ãªããŸãã
try
ãããã¯ã®å®è¡äžã«çºçããæªåŠçã®ãšã©ãŒã¯
catch
ã«æž¡ãããŸãã
finally
çã«ããšã©ãŒãã³ãã©ãŒããªããŠãããšã©ãŒãçºçããå Žåã§ããèµ·åæã«èªä¿¡ãæã£ãŠãã¯ãªãŒã³ã¢ãããã³ãŒããäœæã§ããŸãã
ããã«ãpromiseã䜿çšãããšãã¯ãã€ã§ã
done
ã䜿çšããŸããããã«ãããéåæã³ãŒãã§é »ç¹ã«çºçãããšã©ãŒãéãã«ç¡èŠãã代ããã«ãããã©ã«ãã§ãšã©ãŒãã¹ããŒã§ããŸãã
Q.async
䜿çš
Q.async
ã¯éåžžã次ã®ãšããã§ãã
var getTaggedPosts = Q.async(function*() { var post = yield db.hgetall('blog::post'); var tags = post.tags.split(','); return Q.all(tags.map(function(tag) { return db.hget('blog::tag::' + tag); })); });
äžèšã¯ãåã«ãããã¹ãäœæãããšã©ãŒåŠçãåŠçããªãã©ã€ãã©ãªã³ãŒãã§ãã 次ã®ããã«åŒã³åºããŸãïŒ
Q.async(function*() { var tagged = yield getTaggedPosts();
ããã¯ãããã¬ãã«ã®ã³ãŒãã§ãã åè¿°ããããã«ã
done
ã¡ãœããã¯ãæªåŠçã®ãšã©ãŒã«å¯ŸããŠäŸå€ãšããŠãšã©ãŒãã¹ããŒããããšãä¿èšŒãããŠããŸãã ãã®ã¢ãããŒãã¯äžè¬çã ãšæããŸãããè¿œå ã®ã¡ãœãããåŒã³åºãå¿
èŠããããŸãã
getTaggedPosts
ã¯ãpromiseçæé¢æ°ã«ãã£ãŠäœ¿çšãããŸãã äžèšã®ã³ãŒãã¯ãçŽæã§æºããããåçŽãªãããã¬ãã«ã®ã³ãŒãã§ãã
ãã«ãªã¯ãšã¹ãã§Q.spawnãææ¡ããŸãããããããã®å€æŽã¯ãã§ã«Qã«ãããããŠããŸãïŒ ããã«ãããpromiseã䜿çšããã³ãŒããç°¡åã«å®è¡ã§ããŸãã
Q.spawn(function*() { var tagged = yield getTaggedPosts();
spawn
ã¯ãžã§ãã¬ãŒã¿ãåãåããããã«èµ·åããæªåŠçã®ãšã©ãŒããã¹ãŠèªåçã«ã¹ããŒããŸãã ããã¯
Q.done(Q.async(function*() { ... })())
ãšãŸã£ããåãã§ãã
ãã®ä»ã®ã¢ãããŒã
çŽæãããããŒã¹ã®ãžã§ãã¬ãŒã¿ãŒã³ãŒãã圢ã«ãªãå§ããŸãã ç ç³ã®ç²ãšäžç·ã«ãéåæã¯ãŒã¯ãããŒã«é¢é£ããäœåãªè·ç©ãããããåãé€ãããšãã§ããŸãã
ãžã§ãã¬ãŒã¿ãŒã䜿çšããŠãã°ããããŠãããããã€ãã®ã¢ãããŒãã匷調ããŸããã
䟡å€ããªã
1ã€ã®ãããã¹ã ããåŸ
ã€å¿
èŠãããçãé¢æ°ãããå Žåããžã§ãã¬ãŒã¿ãŒãäœæãã䟡å€ã¯ãããŸããã
var getKey = Q.async(function*(key) { var x = yield r.get(dbkey(key)); return x && parseInt(x, 10); });
ãã®ã³ãŒãã䜿çšããŠãã ããïŒ
function getKey(key) { return r.get(dbkey(key)).then(function(x) { return x && parseInt(x, 10); }); }
ç§ã¯ææ°ããŒãžã§ã³ããããã«èŠãããšæããŸãã
spawnMap
ããã¯ç§ããããã£ãããšã§ãïŒ
yield Q.all(keys.map(Q.async(function*(dateKey) { var date = yield lookupDate(dateKey); obj[date] = yield getPosts(date); })));
Q.all(arr.map(Q.async(...)))
ãè¡ã
spawnMap
ã
spawnMap
ããŠ
Q.all(arr.map(Q.async(...)))
ãšäŸ¿å©ãªå ŽåããããŸãã
yield spawnMap(keys, function*(dateKey) { var date = yield lookupDate(dateKey); obj[date] = yield getPosts(date); })));
ããã¯ã
éåæã©ã€ãã©ãªã®
map
ã¡ãœããã«äŒŒãŠã
map
ã
asyncCallback
æåŸã«æ°ã¥ããã®ã¯ã
Q.async
é¢æ°ãäœæããŠããã¹ãŠã®ãšã©ãŒãã¹ããŒããããå ŽåããããŸãã ããã¯ãexpressïŒ
app.get('/url', function() { ... })
ãªã©ã®ç°ãªãã©ã€ãã©ãªããã®éåžžã®ã³ãŒã«ããã¯ã§çºçããŸãã
äžèšã®ã³ãŒã«ããã¯ã
Q.async
é¢æ°ã«å€æããããšã¯ã§ããŸããããã¹ãŠã®ãšã©ãŒãéãã«æå¶ããããããããã«å®è¡ãããªããã
Q.spawn
ã䜿çšã§ããŸããã ãã¶ãã
asyncCallback
ãããªãã®ãããã§ãããïŒ
function asyncCallback(gen) { return function() { return Q.async(gen).apply(null, arguments).done(); }; } app.get('/project/:name', asyncCallback(function*(req, res) { var counts = yield db.getCounts(req.params.name); var post = yield db.recentPost(); res.render('project.html', { counts: counts, post: post }); }));
ãŸãšããšããŠ
ãžã§ãã¬ãŒã¿ãŒã調ã¹ããšãããžã§ãã¬ãŒã¿ãŒãéåæã³ãŒãã«åœ¹ç«ã€ããšãæ¬åœã«æåŸ
ããŠããŸããã ãããŠãå€æããããã«ããããã¯å®éã«æ©èœããŸããããããããžã§ãã¬ãŒã¿ãŒãšå¹æçã«çµã¿åãããã«ã¯ãPromisesã®ä»çµã¿ãç解ããå¿
èŠããããŸãã promiseãäœæãããšãæé»çãããã«æé»çã«ãªããããpromiseå
šäœãç解ãããŸã§asyncãŸãã¯spawnã䜿çšããããšã¯ãå§ãããŸããã
ããã§ãéåæåäœãã³ãŒãã£ã³ã°ããããã®ç°¡æœã§ä¿¡ããããªãã»ã©åŒ·åãªæ¹æ³ãåŸãããFSãæäœããããã®æäœãããçŸããããã ãã§ãªããããã䜿çšããããšãã§ããŸãã å®éãåæãç¶æããªãããç°ãªãããã»ããµãŸãã¯ãã·ã³ã§å®è¡ã§ããç°¡æœãªåæ£ã³ãŒããäœæããåªããæ¹æ³ããããŸãã
èè
ããã®è£éºïŒæ¬¡ã®èšäºã
ãçŽæã®ãªããžã§ãã¬ãŒã¿ãŒãèŠãããèªãã§
ãã ãã ã