node.js - 是否有更好的依赖函数调用方法而不是堆叠它们?

标签 node.js mongodb function express dependencies

我正在使用 Express 路由器代码,使用 Jade 进行渲染并从 MongoDB 中提取数据以为此做好准备。与以下构造相比,是否有更好的方法将所需的所有数据汇总在一起?请注意,餐厅、顾客和司机之间不存在依赖关系,要求其中一个先返回——我只需要在页面渲染之前执行所有三个。

在某些情况下,其中一些级联调用变得非常深入。必须有更好的构造,对吗?

router.get('/iframe_map/:restaurantid/:customerid', function(req, res, next) {
  Restaurant.findOne({'_id': req.params.restaurantid}, '-_id address name phone status lat lng LatLng marker', function(restaurantErr, restaurantDoc) {
    Customer.findOne({'_id': req.params.customerid}, '-_id address name phone status lat lng LatLng marker', function(customerErr, customerDoc) {
      Driver.find({}, '-_id letterOrdinal address firstName lastName phone status lat lng LatLng marker', {sort: {letterOrdinal: 1}}, function(driverErr, driverDocs) {
        res.render('iframe_map', {
          title:              "Google Map",
          defaultZoomLevel:   12,
          defaultCityState:   ", San Diego, CA",
          oRestaurant:        restaurantDoc,
          oCustomer:          customerDoc,
          oDrivers:           driverDocs
        });  // End of res.render()
      });    // End of Driver.find()
    });      // End of Customer.find()
  });        // End of Restaurant.find()
});          // End of router.get()

最佳答案

这是用异步 waterfall 重写的代码:

router.get('/iframe_map/:restaurantid/:customerid', function(req, res, next) {
    var obj = {};
    async.waterfall([
        function(done) {
            Restaurant.findOne({'_id': req.params.restaurantid}, '-_id address name phone status lat lng LatLng marker', function(err, items) {
                if (err) done(err);
                obj.restaurant = items;
                done(null, obj);
            });
        },
        function(obj, done) {
            Customer.findOne({'_id': req.params.customerid}, '-_id address name phone status lat lng LatLng marker', function(err, items) {
                if (err) done(err);
                obj.customer = items;
                done(null, obj);
            });
        },
        function(obj, done) {
            Driver.find({}, '-_id letterOrdinal address firstName lastName phone status lat lng LatLng marker', {sort: {letterOrdinal: 1}}, function(err, items) {
                if (err) done(err);
                obj.driver = items;
                done(null, obj);
            });
        }
    ], function (err, result) {
        res.render('iframe_map', {
          title:              "Google Map",
          defaultZoomLevel:   12,
          defaultCityState:   ", San Diego, CA",
          oRestaurant:        result.restaurant,
          oCustomer:          result.customer,
          oDrivers:           result.driver
        });
    });
});

关于node.js - 是否有更好的依赖函数调用方法而不是堆叠它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30968760/

相关文章:

c - 蒙戈 : Error converting JSON to BSON

javascript - 什么是 MongoDB 的严格模式,使用它是个好主意吗?

c - 附加字符串的函数返回指针/转换错误

mongodb - 访问/搜索术语自动完成的原始Mongodb文本索引内容(标记化术语)

java - 如果不满足验证标准,则停止/重置 Java 中的函数

c - 为什么 x = a() + ab();在不同的机器上有不同的结果吗?

javascript - 处理 Promise 对象中的错误结果的正确方法是什么?

node.js - 生成 iv 时出现 crypto.createDecipheriv 错误

node.js - 如何在stripe中的支付意图示例中自定义支付方式

javascript - 错误 [ERR_HTTP_HEADERS_SENT] : Cannot set headers after they are sent to the client (multiple data entries)