我正在使用 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/