2

我想模块化的代码令人困惑。我有一个在 Mongodb 中实现的总账。将学分从 转移john到 在 中adam附加以下文件db.dummyTx

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

我想创建一个transfer(from, to, amount, callback())回调接收transaction文档/对象的函数。

我使用该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);}as acallback,它最终将作为最终回调运行。但是,它说err未定义acallback(err, transaction)

忍受我,我async昨天才发现,所以我是一个比喻五岁的孩子。

我的第二个想法是将函数链保存到一个名为的数组transfer中并调用它,就async(transfer,function(err,transaction){if err console.log(err)};好像我无法让它工作一样。

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

4

1 回答 1

1

如果你已经定义了 function acallback,那么你应该只传递它,而不是参数。换句话说,而不是这样:

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

...用这个:

...
      }
    ],
    acallback
  );
}

要使其成为acallback()可选项,您可以做很多事情。有几件事让我想到:

  • 在调用之前async.waterfall(),检查是否acallback()已定义。如果不是,请将其设置为无操作功能。

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

于 2015-05-11T20:09:55.883 回答