在我的服务器控制器代码中,我有一个方法,它根据提供的id检索收入和费用对象。但代码存在问题,如果费用方法失败,则中间件的next()
链断开。所做的基本上是在Income.findById的回调中附加Expense.findById部分。
可以避免这样的嵌套回调吗?请注意,在获取收入之前,expense._id是未知的。
/**
* Transfer middleware
* Returns an income from id if the income has the 'isTransfer attribute set' and the corresponding expense
*/
exports.transferByID = function(req, res, next, id) {
var expense;
Income.findById(id).populate('user', 'displayName').exec(function(err, income) {
if (err) return next(err);
if (! income) return next(new Error('Failed to load Income ' + id));
if(income.isTransfer){
Expense.findById(income.expense).populate('user', 'displayName').exec(function(err, expense) {
if (err) return next(err);
if (! expense) return next(new Error('Failed to load Expense ' + id));
if(expense.isTransfer){
req.transfer = {income:income, expense:expense};
next();
}
});
}else{
req.transfer={};
req.transfer.name = "The selected transaction is not a transfer" ;
}
//What happens if i get here?
});
};
澄清:如果收入成功且费用失败,我会在评论中结束,例如,如果费用没有得到isTransfer === true?。但是,如果我在评论中放下一个,那么下一个将在费用找到之前解雇。