将嵌套异步函数转换为node.js异步函数

时间:2018-02-18 14:55:28

标签: javascript node.js asynchronous

所以我正在电影网站上练习我的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
                    })
                })

            });
        })
});

0 个答案:

没有答案