저는 NodeJS를 처음 사용했기 때문에 비동기 적으로 동시에 IO 작업을 수행하여 전체 요청 시간이 가장 느린 시간에 더 가깝도록 성능 이점을 얻었습니다. IO 작업의 합계가 아니라 모든 IO 작업의 합계입니다.NodeJS는 동시성/비동기식으로 뷰를 생성합니다.
그러나 모든 콜백은 약간 지저분하며 가능하다면 코드를 DRY로 만들기 위해 최선을 다하고 싶습니다.
정상적인 페이지 요청에 대해 머리글 + 본문 + 바닥 글보기를로드하지만 AJAX 요청에 대한 본문 만로드하는 간단한 '팜플렛'유형 5 웹 사이트가 있습니다 (get 매개 변수 'ajaxify'사용) - 결과 컨텐츠는 클라이언트의 페이지 본문에 삽입됩니다.
동시/비동기 IO 작업을 처리 할 때 코드 디자인을 관리하고 모든 IO 작업이 완료되면 응답을 작성하는 방법에 대한 몇 가지 팁을 찾고 있습니다.
이는 NodeJS 모듈 내 첫 번째 시도한다 -
일반적으로 사용되는이 유형의 문제에 대한 디자인 패턴의 모든 유형이 있습니까 (커피 스크립트로 작성된 나는 컴파일 된 자바 스크립트뿐만 아니라 공급 한)?
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')
그리고 정기적으로 컴파일 된 자바 스크립트 : 당신은 당신의 코드를 조금 단순화 할 수
// 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);