2016-04-20 8 views
1

Ich denke, ich muss Async auf eine schlechte Weise verwenden. Der einzige Weg, habe ich es geschafft, es zu tun Async verwendet, ist dies:Verwenden Sie async.js auf eine schlechte Weise

 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); 
     }); 

Es entfernt die Callback-Hölle, aber immer noch ist es die Hölle, es zu lesen.

In einem synchronen Code würde ich diesen einfachen Code-Schnipsel haben:

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

Gibt es eine Möglichkeit, wie mein async.js Beispiel zu vereinfachen?

Antwort

3

Verwenden 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 
}) 
+0

Danke, Golak Sie mir die Augen geöffnet! Sie werden definitiv die Belohnung verdienen. Sobald ich es erhöhen kann, werde ich es dir geben. Ich habe es schließlich mit 'autoInject' gelöst, die ein wenig mehr Lesbarkeit hinzufügen. – zatziky

+0

@zatziky Sie müssen ein Kopfgeld auf diese Frage starten und dann die Antwort manuell vergeben –

+0

Bounty gestartet. In 24 Stunden kann es belohnt werden. – zatziky

1

Aufgrund @GolakSarangi und seine async.auto Lösung entdeckte ich async.autoInject, dass ich noch besser lesbar zu finden.

Hier ist meine Lösung:

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); 
     }]); 
Verwandte Themen