エンドゲームが待ち遠しいですね。と書いているうちにはじまってしまいます。こんにちは。
rete.jsを使いたいためにExpressのチュートリアルを進めています。
今回はこちらのPart5をやります。
https://developer.mozilla.org/ja/docs/Learn/Server-side/Express_Nodejs/Displaying_data
だんだん英語の割合が増えてきています。ページの構成もちょっと謎になってきました。
async
javaScriptの非同期モジュールみたいです。
npm install async
チュートリアルで作っているアプリケーションは特定の順番で処理を行う場合や並列に処理を実行して処理を行う場合や
フローを管理して必要な情報がすべてそろった時にページをレンダリングすることもあるようです。
そんな時にasyncの以下の機能を駆使してやろうよ、ということみたいです。
async.series()
> 特定の順番
async.parallel()
> 並列
async.waterfall()
> 全部揃ったら実行
だいたい読んだ通りのイメージです。
ページを表示するために1つの問い合わせで済む場合
例えばモデルの登録されている数を表示したい場合以下のように書くようです。
Mongooseのモデルのcount()メソッドを使用しています。
export.some_model_count = function(req, res, next){
SomeModel.count({a_model_field: "match_value"}, function(err, count){
res.render("the_template", {data: count});
});
}
parallel
単純な実装ではメソッドを直列に並べて一つ一つ実行結果を受け取って最終的にレンダリングすることです。
その方法は確実ですが時として並列に処理させた方が良いことがあります。
async.parallel()
は並列に処理を実行し、すべてが終了したタイミングでコールバックを受け取ることができるようです。
async.parallel({
one: function(callback){...},
two: function(callback){...},
...
something_else: function(callback){...}
},
function(err, results){
//resultsには{one: 1, two:2, ..., something_else: some_value}みたいにはいってくる模様。
}
);
series
後続の関数が以前の関数のreturnに依存しない場合に順番に実行するにはasync.series
を使うよう。
parallelと書き方がほぼ同じなのはとてもよさそうです。
async.series({
one: function(callback){...},
two: function(callback){...},
...
something_else: function(callback){...}
},
function(err, results){
//resultsには{one: 1, two:2, ..., something_else: some_value}みたいにはいってくる模様。
}
);
確実に順番通り実行するためにはone: function,,,
のところを配列にする必要があるようです。
async.series([function(callback){
callback(null, "one");
},
function(callback){
callback(null, "two");
}],
function(err, results){
//resultsは["one", "two"]のようになるみたいです。
}
);
walterfall
上から順番に処理を渡していく方法です。
async.waterfall([
function(callback){
callback(null, "one", "two");
},
function(arg1, arg2, callback){
//arg1 > one
//arg2 > two
//らしい
callback(null, "three");
}],
function(err, result){
// resultは最後のcallbackのthreeが入ってくる
}
);
⑤の1ってなんだ!ってことですけどつづく