2012-02-22 4 views
0

これは簡単で愚かな質問ですが、私の最初の非同期サーバー言語を学習していて、redisは私の最初のキーバリューDBです。ノードjsとredisを使用する - 可読コードを取得

例。私はこれを行う必要があります:

$x = users:count 
get user:$x 

をしかしasynchronic JavaScriptで私はこのコード

redis-cli.get('users:count', function(err, repl){ 
    if(err){ 
    errorHandler(err); 
    } else { 
    redis-cli.get('user:'+repl, function(err, repl){ 
     if(err){ 
     errorHandler(err); 
     } else { 
     console.log('We get user '+repl+'!') 
     } 
    }) 
    } 
}) 

それほど大きくないとあまりにネストされていないが、それは私のfirtない例/テストプロジェクトに似ています。このコードを取得します私は狂ったネストされた関数 - コールバックを取得します。

これを解決して可読性の高いコードを作成するにはどうすればよいですか?

+1

てみてください[非同期](https://github.com/caolan/async)またはフロー:あなたはバインドはその後、抽象化していることを好む場合は、通常のような閉鎖に格納される状態を保存するためにthisを使用することができます –

答えて

2
function getUserCount(callback, err, repl) { 
    if (err) { 
    return callback(err); 
    } 
    redis-cli.get('user:' + repl, getUser.bind(null, callback)); 
} 

function getUser(callback, err, repl) { 
    if (err) { 
    return callback(err); 
    } 
    console.log('We get user ' + repl + '!'); 
} 

redis-cli.get('users:count', getUserCount.bind(null, errorHandler)); 

bind作品不思議。

require("underscore").bindAll({ 
    run: function (errorHandler) { 
    this.errorHandler = errorHandler; 
    redis-cli.get('users:count', this.getUserCount); 
    }, 
    getUserCount: function (err, repl) { 
    if (err) return this.errorHandler(err); 
    redis-cli.get('user:' + repl, this.getUser); 
    }, 
    getUser: function (err, repl) { 
    if (err) return this.errorHandler(err); 
    console.log('got user ', repl); 
    } 
}).run(errorHandler); 
関連する問題