我用 async.js 的方式不好吗

Do I use async.js in a bad way

我想我使用 Async 的方式一定很糟糕。我设法使用 Async 做到这一点的唯一方法是:

        var email = request.payload.email;

        async.waterfall([
            function (callback) {
                async.parallel({
                    title    : function (callbackWaterfall) {
                        async.waterfall([
                            async.apply(UserDao.findUser, email),
                            createTripTitle
                        ], callbackWaterfall)
                    },
                    tripCount: TripDao.countTrips
                }, callback)
            },
            function (results, callback) {
                TripDao.createTrip(results.title, results.tripCount, callback);
            }
        ], function (err, trip) {
            resCallback(err, request, response, trip);
        });

它消除了回调地狱,但阅读它仍然是地狱。

在同步代码中,我会有这个简单的代码片段:

var email = request.payload.email,
    user = UserDao.findUser(email),
    title = getTitle(user),
    tripCount = countMyTrips(),
    newTrip = TripDao.createTrip(title, tripCount);

有没有办法简化我的 async.js 示例?

使用async.auto

var email = request.payload.email

async.auto({
    user: async.apply(UserDao.findUser, email),
    title: ['user', function (results, callback){
        getTitle(results['user'], callback)
    }],
    tripCount: async.apply(countMyTrips),
    newTrip: ['title', tripCount', function (results, callback) {
        TripDao.createTrip(results['title'], results['tripCount'], callback);
    }]
}, function (err, results) {
    //all done
})

由于@GolakSarangi 和他的 async.auto 解决方案,我发现 async.autoInject 我发现它更具可读性。

这是我的解决方案:

async.autoInject({
            tripCount: TripDao.countTrips,
            email: function(callback){ callback(null /*err*/, request.payload.email) },
            user: ['email', UserDao.findUser],
            title: ['user', createTripTitle],
            trip: ['title', 'tripCount', TripDao.createTrip]
        }, ['trip', function(err, trip){
            resCallback(err, request, response, trip);
        }]);