如何等待所有异步调用完成

sta*_*er2 2 mongoose node.js

我正在使用Mongoose和Node.js,并且在完成所有save()调用之后,将使用以下代码调用回调.但是,我觉得这是一种非常肮脏的方式,并且希望看到完成这项工作的正确方法.

function setup(callback) {

  // Clear the DB and load fixtures
  Account.remove({}, addFixtureData);

  function addFixtureData() {
    // Load the fixtures
    fs.readFile('./fixtures/account.json', 'utf8', function(err, data) {
      if (err) { throw err; }
      var jsonData = JSON.parse(data);
        var count = 0;
        jsonData.forEach(function(json) {
          count++;
          var account = new Account(json);
          account.save(function(err) {
            if (err) { throw err; }
            if (--count == 0 && callback) callback();
          });
        });
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

evi*_*ery 5

您可以使用asyncStep等库来清理代码.

另外,我写了一个小模块,为你处理加载灯具,所以你只需:

var fixtures = require('./mongoose-fixtures');

fixtures.load('./fixtures/account.json', function(err) {
  //Fixtures loaded, you're ready to go
};
Run Code Online (Sandbox Code Playgroud)

Github:https: //github.com/powmedia/mongoose-fixtures

它还将加载夹具文件或对象的目录.