我一直在使用猫鼬,但我似乎无法绕过“回调地狱”,并使用错误处理来污染我的查询。
例如,这是我的路线:
var homePage = function(req, res) {
var companyUrl = buildingId = req.params.company
db.pmModel
.findOne({ companyUrl: companyUrl })
.exec(function (err, doc) {
if (err)
return HandleError(req, res, err)
if( !doc )
return NoResult(req, res, {msg: 'Aint there'})
console.log(doc)
db.rentalModel
.find({ propertyManager: doc.id })
.populate('building')
.exec(function (err, rentals) {
if (err)
return HandleError(req, res, err)
if( !doc )
return NoResult(req, res, {msg: 'Aint there'})
console.log(doc)
var data = doc.toJSON()
data.rentals = rentals
res.render('homePage', data)
})
})
}
我的问题是:有没有更简洁的方式写这个?
因此,也许您上面的内容只是一个小例子,但在我看来,您的代码中并没有发生太多“回调地狱”(我认为)。但是,您当然可以重构代码。只是知道这样做,从维护的角度来看,您可能会更难以理解或遵循。
您可以做的一件事就是简单地重构数据库层。如果您总是发现自己查询一个集合,然后又转而查询另一个集合,则可以考虑合并这些集合,或者至少合并要查找的文档。在关系数据库中,您可能会分离这些表并进行合并,但是在基于文档的数据库中,有时将每个文档中的数据合并起来更有意义。这样可以简化代码中的查询并简化逻辑。
另一个解决方案是将调用重构为单独的函数,并以不同的方式控制流程。一个流行的用于解决此问题的库是async,它提供了许多帮助程序功能来辅助JavaScript的异步世界。有很多选择,但是一个建议是针对您的情况使用瀑布函数(因为每个调用必须在下一个调用之前进行)。然后看起来像这样:
async.waterfall([
function(callback){
findCompany(companyUrl, callback);
},
function(id, callback){
findPropertyManager(id, callback);
}
], function (err, rentals) {
res.render(rentals)
});
您仍然需要处理每个函数中的错误,但是您甚至可以将其重构为辅助函数。此外,您可以选择自己编写一些代码来帮助控制流程,而不是使用异步。
但是同样,您在上面显示的代码是可以理解和阅读的,并且仅包含几个内联回调。这样,可以减少很多事情,并且可能使以后的调试(如果出现问题)更加容易。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句