【问题标题】:Asynchronous callbacks in JavaScriptJavaScript 中的异步回调
【发布时间】:2016-09-02 10:04:23
【问题描述】:

这里是 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 个请求时,我必须在 6 个回调中嵌入我的 res 对象?

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

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

【问题讨论】:

  • 向回调地狱问好——callbackhell.com
  • 你应该看看像 async 这样的包和 Promises 来帮助你摆脱回调地狱。
  • @BlazeSahlzen 谢谢!

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2015-01-05
    • 2016-08-19
    • 1970-01-01
    • 2013-05-15
    • 2018-12-10
    相关资源
    最近更新 更多