所以我正在电影网站上练习我的node.js / angular技能。最近我注意到我的服务器端有很多嵌套的异步函数。许多人建议使用async.js模块。
下面是同一服务器端目标的两个不同版本。一个是原始的嵌套异步函数,另一个是我使用Async.js提出的。有人能看到我是否以正确的方式做到了,在这种情况下使用正确的方法(瀑布)并且可能会给我一些可以改善我的代码的更正?它有效,但也许你们可以看到一些改进?例如:是否有替代方法每次都将变量传递给参数(就像我使用reviewId那样)
额外问题:
async.js模块最常用的方法是什么?因为有数百个,我只想学习最重要的一些。
当我尝试翻译下面的嵌套异步函数时,我想出了这些
router.delete('/deleteReview/:reviewId', function(req, res, next) {
async.waterfall([
function (callback) {
var reviewId = req.params.reviewId;
Review.find({'_id': reviewId})
.populate('user')
.populate('movie')
.exec(function(err, review){
callback(null, review, reviewId)
});
},
function (review, reviewId, callback) {
var index = review[0].user.reviews.indexOf(reviewId);
review[0].user.reviews.splice(index, 1);
review[0].user.save(function(err, user){
callback(null, user, reviewId, review)
})
},
function (user, reviewId, review, callback) {
var index = review[0].movie.reviews.indexOf(reviewId);
review[0].movie.reviews.splice(index, 1);
review[0].movie.save(function(err, movie){
callback(null, movie, index)
});
}
], function (err, result, index) {
if (err) {
res.status(500).json({
message: "An error occurred",
obj: err
})
}
res.status(200).json({
message: "successful",
obj: index
})
});
});
原始嵌套异步函数
router.delete('/deleteReview/:reviewId', function(req, res, next){
var reviewId = req.params.reviewId;
Review.find({'_id': reviewId})
.populate('user')
.populate('movie')
.exec(function(err, review){
if (err) {
res.status(500).json({
message: "An error occurred",
obj: err
})
}
var index = review[0].user.reviews.indexOf(reviewId);
review[0].user.reviews.splice(index, 1);
review[0].user.save(function(err, user){
if (err) {
res.status(500).json({
message: "An error occurred",
obj: err
})
}
var index = review[0].movie.reviews.indexOf(reviewId);
review[0].movie.reviews.splice(index, 1);
review[0].movie.save(function(err, movie){
if (err) {
res.status(500).json({
message: "An error occurred",
obj: err
})
}
res.status(200).json({
message: "successful",
obj: index
})
})
});
})
});