私はNodeJSを初めて使用し、非同期で同時に実行するIO操作のパフォーマンス上の利点に惹かれます。そのため、合計要求時間は、すべてのIO操作の合計ではなく、最も遅いIO操作を実行するために必要な時間に近くなります。
ただし、すべてのコールバックは少し面倒なので、コードをできるだけDRYにするために最善を尽くしたいと思います。
通常のページリクエストのヘッダー+本文+フッタービューを読み込むシンプルな「パンフレット」タイプ5ページのウェブサイトがありますが、AJAXリクエストの本文のみを読み込みます(get param'ajaxify'を使用)-結果のコンテンツが挿入されますクライアントのページの本文に。
同時/非同期IO操作を処理するときにコード設計を管理し、すべてのIO操作が完了したときに応答を形成する方法に関するヒントを探しています。
これは、NodeJSモジュールを使った最初の試みです(coffeescriptで記述されています-コンパイルされたjavascriptも提供しています)
このタイプの問題で一般的に使用されているタイプのデザインパターンはありますか?
os = require 'os'
url = require 'url'
html_minifier = require 'html-minifier'
render_views = (req, res, body_view, code = 200) ->
complete = (arg) ->
response = arg.response
code = arg.code
if query.hasOwnProperty 'ajaxify'
res.send html_minifier.minify response.body,
collapseWhitespace: true
removeComments: true,
code
else
if response.header != '' and response.body != '' and response.footer != ''
res.send html_minifier.minify response.header + response.body + response.footer,
collapseWhitespace: true
removeComments: true,
code
query = url.parse(req.url, true).query
response =
header: ''
body: ''
footer: ''
if query.hasOwnProperty 'ajaxify'
code = 200
res.render body_view, {}, (err, html) ->
response.body = html
complete
response: response
code: code
else
res.render body_view, {}, (err, html) ->
response.body = html
complete
response: response
code: code
res.render 'view_header', {}, (err, html) ->
response.header = html
complete
response: response
code: code
res.render 'view_footer', {}, (err, html) ->
response.footer = html
complete
response: response
code: code
exports.index = (req, res) ->
render_views(req, res, 'view_index')
exports.services = (req, res) ->
render_views(req, res, 'view_services')
exports.about = (req, res) ->
render_views(req, res, 'view_about')
exports.blog = (req, res) ->
render_views(req, res, 'view_blog')
exports.contact = (req, res) ->
render_views(req, res, 'view_contact')
exports.error = (req, res) ->
render_views(req, res, 'view_error', '404')
そして通常のコンパイルされたjavascript:
// Generated by CoffeeScript 1.4.0
(function() {
var html_minifier, os, render_views, url;
os = require('os');
url = require('url');
html_minifier = require('html-minifier');
render_views = function(req, res, body_view, code) {
var complete, query, response;
if (code == null) {
code = 200;
}
complete = function(arg) {
var response;
response = arg.response;
code = arg.code;
if (query.hasOwnProperty('ajaxify')) {
return res.send(html_minifier.minify(response.body, {
collapseWhitespace: true,
removeComments: true
}, code));
} else {
if (response.header !== '' && response.body !== '' && response.footer !== '') {
return res.send(html_minifier.minify(response.header + response.body + response.footer, {
collapseWhitespace: true,
removeComments: true
}, code));
}
}
};
query = url.parse(req.url, true).query;
response = {
header: '',
body: '',
footer: ''
};
if (query.hasOwnProperty('ajaxify')) {
code = 200;
return res.render(body_view, {}, function(err, html) {
response.body = html;
return complete({
response: response,
code: code
});
});
} else {
res.render(body_view, {}, function(err, html) {
response.body = html;
return complete({
response: response,
code: code
});
});
res.render('view_header', {}, function(err, html) {
response.header = html;
return complete({
response: response,
code: code
});
});
return res.render('view_footer', {}, function(err, html) {
response.footer = html;
return complete({
response: response,
code: code
});
});
}
};
exports.index = function(req, res) {
return render_views(req, res, 'view_index');
};
exports.services = function(req, res) {
return render_views(req, res, 'view_services');
};
exports.about = function(req, res) {
return render_views(req, res, 'view_about');
};
exports.blog = function(req, res) {
return render_views(req, res, 'view_blog');
};
exports.contact = function(req, res) {
return render_views(req, res, 'view_contact');
};
exports.error = function(req, res) {
return render_views(req, res, 'view_error', '404');
};
}).call(this);