【问题标题】:Do I use async.js in a bad way我是否以不好的方式使用 async.js
【发布时间】:2017-03-19 02:31:49
【问题描述】:

我想我一定是在以一种糟糕的方式使用 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);
        });

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

在同步代码中,我会有这个简单的代码 sn-p:

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

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

【问题讨论】:

    标签: async.js


    【解决方案1】:

    使用 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
    })
    

    【讨论】:

    • 谢谢你,Golak,你让我大开眼界!你绝对应该得到回报。只要我能把它养起来,我就给你。我终于用autoInject 解决了这个问题,增加了一些可读性。
    • @zatziky 你必须在这个问题上开始赏金,然后手动奖励答案
    • 赏金活动开始。 24小时内即可获得奖励。
    【解决方案2】:

    由于@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);
            }]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 2015-08-05
      • 2019-06-13
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      相关资源
      最近更新 更多