我正在学习节点,并希望优化我所做的代码。我尝试使用Async.parallel来执行操作,完成后返回一个json。 我是js节点的新手,我正在尝试使用async.parallel,但我在其他代码中返回[Function],我正在尝试理解它
getTabletIntRout: function(req, res) {
var reqMAC = req.param('id_tablet');
Tablet.findOne(reqMAC).populate('rout_tablet').exec(function(err, tablet) {
if (err) return next(err);
if (!tablet) return next();
var arrRoutes = tablet.rout_tablet;
if (arrRoutes.length > 0) {
var routesNotRemoved = [];
arrRoutes.forEach(function(route) {
if (route.removed == 'no') {
Rout.findOne(route.id)
.populate('rout_assigned') // Pin
.populate('in_rout') // Tablet
.populate('rout_description_assigned')
.exec(function(err, rout2) {
var arrRout = rout2.rout_assigned;
var routsNotRemoved = [];
if (arrRout.length > 0) {
arrRout.forEach(function(ruta) {
if (ruta.removed == 'no') {
routsNotRemoved.push(ruta);
}
});
}
var arrTablets = rout2.in_rout;
var tabletsNotRemoved = [];
if (arrTablets.length > 0) {
arrTablets.forEach(function(tab) {
if (tab.removed == 'no') {
tabletsNotRemoved.push(tab);
}
});
}
var arrDesc = rout2.rout_description_assigned;
var descripNotRemoved = [];
if (arrDesc.length > 0) {
arrDesc.forEach(function(desc) {
if (desc.removed == 'no') {
descripNotRemoved.push(desc);
}
});
}
rout2.rout_assigned = routsNotRemoved;
rout2.in_rout = tabletsNotRemoved;
rout2.rout_description_assigned = descripNotRemoved;
routesNotRemoved.push(rout2);
});
}
});
setTimeout(function() {
if (routesNotRemoved.length > 0) {
res.json({ info: routesNotRemoved });
} else {
return res.json({"error": "-1", "message": "Todas las rutas asociadas a esa tablet están eliminadas"});
}
}, 2000);
} else {
return res.json({"error": "-2", "message": "No existen rutas asociadas en esa tablet"});
}
}););});}},
答案 0 :(得分:4)
我会尝试提供一些想法,希望有些想法会在您的域名中有意义。
所以而不是
Tablet.findOne(reqMAC).populate('rout_tablet').exec(function(err, tablet) { // ...
你会有
Tablet.findOne(reqMAC).populate('rout_tablet').exec(meaningfulFunctionName);
所以你的代码会变短,每当代码的读者找到一个函数名时,他/她就已经知道里面发生了什么
if (arrRout.length > 0) {
arrRout.forEach(function(ruta) {
if (ruta.removed == 'no') {
routsNotRemoved.push(ruta);
}
});
}
无需检查空arrRout
,因为arrRout.forEach
的参数函数在length
为零的情况下不会运行。
您所写的只是一个过滤功能,为什么不使用filter
?像这样
arrRout.filter(function(ruta) {
return ruta.removed == 'no';
});
如果您为arrTablets
和arrDesc
提取匿名函数,也可以重复使用此项。
论证:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
if else
要么检查反向,要么返回默认值或在您的域中有意义的内容,但是没有那么大的逻辑,这使得很难推断出您的代码。
async
你可能想要这样的东西
async.waterfall([
function(next) {
// here you can put
// Tablet.findOne(reqMAC).populate('rout_tablet').exec
// invoke next with err, tablet
},
function(tablet, next) {
async.each(arrRoutes, function(arrRoute, nextEach) {
// write your code logic here
});
}
], function() {
// decide what to invoke res.json with
});
请记住在完成将逻辑放入异步步骤之后提取功能,我没有这样做,所以更清楚地放置什么。
我希望这是有道理的,随时问你是否有任何疑问。
下次发帖时,请确保正确缩进,不要将其粘贴到此处。