2

コールバックの書き方に関する多くのチュートリアルを読みました。ただし、これらのいずれも、推奨される設計が何であるかを実際に理解するものではありません.

シンプルでありながらコンパイル可能で実行可能に保つために、架空のクエリ関数を使用して架空の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 ライブラリによって実行される別のコールバックの一部として実行されます
  • 私自身の高価な/複雑なアルゴリズム/操作
4

1 に答える 1

3

規則に従って、すべてのノード コールバックを設計する必要があります。

var callback = function(err, data1, data2){
}

コールバックの最初の引数は、常に発生した可能性のあるエラーにする必要があります。

ノード標準ライブラリまたは独自のコードのコールバックであるかどうかに関係なく、この規則に従う必要があります。

この規則に従えば、async.js などのライブラリや、この規則に依存する他の promises ライブラリを使用できるようになります。ドメインもこの規則に依存しています。

于 2013-07-04T09:07:41.060 に答える