2016-05-07 23 views
0

ここでPHP DevはNodeJSとしばらくレスリングしていますが、私はまだ非同期という考えをJS/Nodeとしています。私はフェッチデータのコールバック内のビューをレンダリングする必要がresオブジェクトのデータベース値にアクセスできるようにするにはJavaScriptの非同期コールバック

router.get('/:id', function (req, res, next) { 
    var id = req.params.id; 
    var db = new Firebase('some_firebase_db'); 
    db.child("users/"+id).once('value', function (snapshot) { 
     var user = snapshot.val(); 
     if (user) { 
      db.child("messages/"+id).once('value', function (snapshot) { 
       res.render('user/messages', { 
        'user': user, 
        'messages': snapshot.val() 
       }); 
      }); 
     } else { 
      res.render('404'); 
     } 
    }); 
}); 

:この(ExpressJS)で

ルック。

私のDBに6つのリクエストを作成する必要がある場合、resオブジェクトを6コールバックに埋め込む必要がありますか?

また、非同期にしてコードを読みやすくするさまざまな方法がありますか?

最終的には、私のコードをクリスマスツリーのように見せない1回のリクエストで、複数回データベースからデータをフェッチする方法が必要です。

+4

コールバックhell - helllo hell - http://callbackhell.com –

+2

[async](https://www.npmjs.com/package/async)のようなパッケージをチェックして、コールバック地獄の手伝いを約束してください。 –

+0

@BlazeSahlzenありがとう! – lilly

答えて

2

あなたもasyncまたはPromiseを使用せずに、それをより読みやすくすることができます。

router.get('/:id', function(req, res, next) { 
    var id = req.params.id; 
    var db = new Firebase('some_firebase_db'); 

    db.child("users/" + id).once('value', userResult); 

    function userResult(snapshot) { 
    var user = snapshot.val(); 
    if (user) { 
     db.child("messages/" + id).once('value', messageResult); 
    } else { 
     res.render('404'); 
    } 
    } 

    function messageResult(snapshot) { 
    res.render('user/messages', { 
     'user': user, 
     'messages': snapshot.val() 
    }); 
    } 
}); 

しかしasyncまたはPromiseを使用して、より良い解決策になります。

関連する問題