たとえば、データを取得するだけの関数があります
exports.content = function(req, res){
getData(req, function(err, data) {
// trivial error handling
if (err) {
console.dir('error getting your data', err);
return res.redirect('/');
}
res.render('content', data)
}
// cb is a callback function
function getData(req, cb) {
OPID = req.params.id;
titles.findOne({postID: OPID}, function (err, post) { //function #1
if (err) { return cb(err); }
readComment(OPID, function(err, comment){ //function #2 (with error handling)
if (err) { return cb(err); }
branchFilter.getBranches(function(err, branches){ //function #3
if (err) { return cb(err); }
var output = {
title: post.title,
content: post.body,
OPID: post.postID,
comments: comment, branches: branches
}
return cb(null, output);
});
});
});
}
http://callbackhell.com/をご覧ください。コールバックを使用してクリーンなコードを作成する方法の概要がよくわかります。以下、同サイトより転載
関数に名前を付ける
以下は、browser-request を使用してサーバーへの AJAX リクエストを行う (乱雑な) ブラウザー JavaScript です。
var form = document.querySelector('form')
form.onsubmit = function(submitEvent) {
var name = document.querySelector('input').value
request({
uri: "http://example.com/upload",
body: name,
method: "POST"
}, function(err, response, body) {
var statusMessage = document.querySelector('.status')
if (err) return statusMessage.value = err
statusMessage.value = body
})
}
このコードには 2 つの無名関数があります。名前をつけよう!
var form = document.querySelector('form')
form.onsubmit = function formSubmit(submitEvent) {
var name = document.querySelector('input').value
request({
uri: "http://example.com/upload",
body: name,
method: "POST"
}, function postResponse(err, response, body) {
var statusMessage = document.querySelector('.status')
if (err) return statusMessage.value = err
statusMessage.value = body
})
}
ご覧のとおり、関数の名前付けは非常に簡単で、コードにいくつかの優れた点をもたらします。
- コードを読みやすくする
- 例外が発生すると、「匿名」ではなく実際の関数名を参照するスタックトレースが取得されます
- コードを浅く保つか、深くネストしないようにすることができます。これにより、次のポイントに進みます。
コードを浅くする
最後の例に基づいて、さらに進んで、コード内で行われているトリプル レベルのネストを取り除きましょう。
function formSubmit(submitEvent) {
var name = document.querySelector('input').value
request({
uri: "http://example.com/upload",
body: name,
method: "POST"
}, postResponse)
}
function postResponse(err, response, body) {
var statusMessage = document.querySelector('.status')
if (err) return statusMessage.value = err
statusMessage.value = body
}
document.querySelector('form').onsubmit = formSubmit
このようなコードは、見た目が怖くなく、後で編集、リファクタリング、ハッキングするのが簡単です。
モジュール化!
これが最も重要な部分です: 誰でもモジュール (別名ライブラリー) を作成できます。(node.js プロジェクトの) Isaac Schlueter の言葉を引用すると、「それぞれが 1 つのことを行う小さなモジュールを作成し、それらをより大きなことを行う別のモジュールにアセンブルします。そこに行かなければ、コールバック地獄に入ることができません。 ."
上記のボイラープレート コードを取り出し、いくつかのファイルに分割してモジュールに変換しましょう。私はブラウザとサーバーの両方で JavaScript を書いているので、両方で動作するメソッドを示しますが、それでも素晴らしくシンプルです。
以前の 2 つの関数を含む formuploader.js という名前の新しいファイルを次に示します。
function formSubmit(submitEvent) {
var name = document.querySelector('input').value
request({
uri: "http://example.com/upload",
body: name,
method: "POST"
}, postResponse)
}
function postResponse(err, response, body) {
var statusMessage = document.querySelector('.status')
if (err) return statusMessage.value = err
statusMessage.value = body
}
exports.submit = formSubmit