Node.js 使用async.瀑布减少了嵌套,但增加了混乱

Node.js 使用async.瀑布减少了嵌套,但增加了混乱,node.js,node-async,Node.js,Node Async,我试图通过使用减少异步调用(node+socket.io)的嵌套,结果不得不在瀑布中追加参数,因为以后需要这些参数。这段代码可以更好地解释: //原文: socket event: turn action socket.on('turn action', function(gameId, turnAction, clientFn) { socket.get('corp', function(err, corp) { gameProvider.processTurnAct

我试图通过使用减少异步调用(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);
      });
    }
  ]);
目标是可读性,但我发现冗余参数传递增加了混乱。我知道我可以在调用async.瀑布之前声明变量,并根据需要存储参数以供以后在链中使用,但这对可读性没有帮助


有没有一种方法可以让它更优雅?

我很好奇瀑布中的第一个函数,它设置了
翻转动作处理程序。因为它只是指定了一个事件处理程序,所以它在技术上是同步的(即使处理程序本身将被异步调用)。我可能会这样重构它:

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

这还有一个额外的好处,就是将任何
错误
参数传递到最终回调中,因此您可以根据需要处理它们(例如,使用指定错误的参数调用
clientFn

老实说,我觉得它很优雅。这就像一个魅力!我是根据docs:tasks中提到的需求手动调用回调函数的。tasks是一个要运行的函数数组,每个函数在完成时都会被传递一个回调函数。我没有意识到我调用的函数满足了这一点。现在瀑布对我来说更有用了,谢谢!是的,这是JavaScript中的一种模式,当回调函数与调用的函数具有相同的参数时;我在这里说得更多:实际上我说得太快了。当将回调传递给socket api时,它会滚动到下一个函数,但我自己的函数会滚动到最后一个可选回调。在调试器中看起来很好,因此我不确定我传递的参数在async.js代码中的计算结果为何为错误。是否确保在没有错误时将
null
作为第一个参数传递给回调?Async遵循Node.js回调模式,具有参数
fn(error,others…
),因此您需要调用类似
callback(null,message,game)
。是的,这似乎是修复方法。我还错误地假设了socket.set的行为,这使我的var超出了范围。我必须在socket.on()的回调函数中声明一个本地变量,以获取对该变量的引用,以便在调用socket.set之后的函数中使用它。我可能只是内联执行socket.set()回调来避免这种情况,而只是执行“回调(myvar)”。另外,感谢nodecast链接。