在nodejs中创建异步回调函数

时间:2015-05-11 20:00:26

标签: javascript node.js asynchronous node-async

我有令人困惑的代码,我想模块化。我有一个在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);}作为acallback传递,它最终将作为最终回调运行。但是,它说err

中未定义acallback(err, transaction)

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

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

修改:我还希望acallback参数是可选的。

1 个答案:

答案 0 :(得分:1)

如果您已定义函数$(function() { $("#two").hover(function() { $("#two").css("background-color","blue"); }, function() { $("#two").css("background-color",""); }); }); ,那么您应该只传递它,而不是参数。换句话说,而不是:

acallback

...使用此:

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

要使... } ], acallback ); } 可选,您可以执行许多操作。有些事情让人想起:

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

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