有没有更好的依赖函数调用方法堆叠它们?

我使用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() 

这里是你的代码重写asynchronous瀑布:

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