コールバックの書き方に関する多くのチュートリアルを読みました。ただし、これらのいずれも、推奨される設計が何であるかを実際に理解するものではありません.
シンプルでありながらコンパイル可能で実行可能に保つために、架空のクエリ関数を使用して架空のDBを介してユーザーをログインさせる次のコードを想像してください。
var db = {};
// fake query function for demonstration purposes
db.query = function(query, cb) {
console.log('Running an expensive query:', query);
if (query == 'get uid from db')
return cb(null, {password: 'pwd'});
return cb(null, {password: 'pass'});
}
var login = function(user, password, cb) {
var q = 'get ' + user + ' from db';
db.query(q, function(err, user) {
if (err || !user || user.password != password)
return cb(false);
return cb(true);
});
};
console.log('pre');
login('uid', 'pwd', function(success) {
console.log('Login', success ? 'was successful' : 'failed');
});
console.log('post');
module.exports = null;
query
このコードでは、関数のコールバックを正しい非同期方法で処理するために DB 層に依存しているため、関数内の独自のコールバックlogin
も非同期で呼び出されます。
しかし、これは私自身のコールバックの正しい設計ですか? db.query
コールバックを呼び出しにラップした方がよいprocess.nextTick()
でしょうか? それとももっと良い方法がありますか?
私が興味を持っているのは、これら 2 種類のコールバックをどのように設計するかを理解することです。
- コールバックは、node.js ライブラリによって実行される別のコールバックの一部として実行されます
- 私自身の高価な/複雑なアルゴリズム/操作