在nodejs中制作异步回调函数

Making async callback functions in nodejs

我有一些令人困惑的代码,我想将其模块化。我有一个在 Mongodb 中实现的总分类帐。将学分从 john 转移到 adam 会在 db.dummyTx 中附加以下文档:

{
  "debitAccount": "john",
  "creditAccount": "adam",
  "amount": 10
}

我想创建一个函数 transfer(from, to, amount, callback()),其中回调接收 transaction document/object。

我使用 async 模块创建了以下内容:

function transfer(from, to, amount, acallback) {
  async.waterfall([
      function(callback) {
        userBalance(from);
        userBalance(to);
        callback(null);
      },
      function(callback) {
        var transaction = new dummyTx();
        transaction.creditAccount = from; // in the account of the sender
        transaction.debitAccount = to; // with reference to the reciever
        transaction.amount = amount; // of the given amount
        transaction.save(function(err) {
          callback(null, transaction);
        });
      },
      function(transaction, callback) {
        console.log("Credited User " + transaction.creditAccount +
          " and debited User " + transaction.debitAccount + " by amount " +
          transaction.amount + "credits");
        callback(null, transaction);
      },
      function(transaction, callback) {
        userBalance(transaction.creditAccount);
        userBalance(transaction.debitAccount);
        callback(null, transaction);
      }
    ],
    acallback(err, transaction)
  );
}

我的理由是,如果我将 function(err,transaction){if err console.log(err);} 作为 acallback 传递,它将 运行 作为最后的回调。但是,它说 erracallback(err, transaction)

中未定义

请耐心等待,我昨天才发现 async,所以我是一个比喻性的五岁孩子。

我的第二个想法是将函数链保存到一个名为 transfer 的数组中,如果我不能让它工作,就将其称为 async(transfer,function(err,transaction){if err console.log(err)};

编辑: 我还希望 acallback 参数是可选的。

如果您定义了函数 acallback,那么您应该只传递它,而不是参数。换句话说,而不是这个:

...
      }
    ],
    acallback(err, transaction)
  );
}

...使用这个:

...
      }
    ],
    acallback
  );
}

要使 acallback() 可选,您可以做很多事情。突然想到的几件事:

  • 调用前,async.waterfall(),检查是否定义了acallback()。如果不是,请将其设置为无操作函数。

  • 在调用async.waterfall()之前,检查是否定义了acallback()。如果不是,请在没有它​​的情况下调用 async.waterfall()。如果是,用它调用它。