JavaScript中的异步回调

Asynchronous callbacks in JavaScript

本文关键字:回调 异步 JavaScript      更新时间:2023-09-26

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对象可以访问数据库值,我需要在获取数据回调中呈现视图。

所以,当我需要,比如说,向我的DB发出6个请求时,我将不得不在6个回调中嵌入我的res对象?

或者有没有不同的方法可以使代码更可读,保持异步?

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

即使不使用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将是更好的解决方案。