用async.waterfall减less了嵌套,但增加了混乱

我正在尝试通过使用async.waterfall来减lessasynchronous调用(node + socket.io)的嵌套,最后我不得不在瀑布后面添加参数,因为以后需要它们。 这个代码可能更好地解释:

//原始版本:

  socket event: turn action socket.on('turn action', function(gameId, turnAction, clientFn) { socket.get('corp', function(err, corp) { gameProvider.processTurnAction(gameId, corp.id, turnAction, function(err, msg, game) { clientFn(msg, game); }); }); }); 

// async.js版本

  async.waterfall([ function(callback) { socket.on('turn action', function(gameId, turnAction, clientFn) { callback(null, gameId, turnAction, clientFn); }); }, function(gameId, turnAction, clientFn, callback) { socket.get('corp', function(err, corp) { callback(null, gameId, turnAction, clientFn, corp); }); }, function(gameId, turnAction, clientFn, corp, callback) { gameProvider.processTurnAction(gameId, corp.id, turnAction, function(err, msg, game) { clientFn(msg,game); }); } ]); 

目标是可读性,但我发现多余的parameter passing增加了混乱。 我知道我可以在调用async.waterfall之前声明variables,并根据需要存储参数以供以后使用,但这对于可读性没有帮助。

有没有办法让这更优雅?

我很好奇瀑布中的第一个函数,它设置了turn action处理程序。 既然它只是指定一个事件处理程序,它在技术上是同步的(即使处理程序本身将被asynchronous调用)。 我可能会重构它:

 socket.on('turn action', function(gameId, turnAction, clientFn) { async.waterfall([ function(callback) { socket.get('corp', callback); }, function(corp, callback) { gameProvider.processTurnAction(gameId, corp.id, turnAction, callback); } ], function(err, msg, game) { // err will be set if either of the two `callback`s were called with // an error as the first parameter clientFn(msg, game); }); } 

这有附加的好处,就是将任何errorparameter passing给最终的callback函数,所以你可以根据需要处理它们(比如用一个指定错误的参数调用clientFn )。