JavaScript中的异步回调

时间:2016-05-07 10:41:11

标签: javascript node.js express firebase firebase-realtime-database

PHP开发人员,我正在与NodeJS搏斗一段时间,我仍然无法理解异步是JS / Node的想法。

看看这个(ExpressJS):

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');
        }
    });
});

要使res对象可以访问数据库值,我需要在获取数据回调中呈现视图。

因此,当我需要向我的数据库发出6个请求时,我必须将我的res对象嵌入6个回调中?

或者是否有不同的方法可以使代码更具可读性,使其保持异步?

最终,我需要一种方法在一次请求中多次从db中获取数据,这不会使我的代码看起来像圣诞树。

1 个答案:

答案 0 :(得分:2)

即使不使用asyncPromise

,您也可以使其更具可读性
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()
    });
  }
});

但使用asyncPromise将是更好的解决方案。