2

私は Node.js で Mongoose を使用しており、すべての 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();
          });
        });
    });
  }
}
4

5 に答える 5

5

asyncStepなどのライブラリを使用して、コードを少しクリーンアップできます。

また、フィクスチャのロードを処理する小さなモジュールを作成したので、次のようにします。

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

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

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

また、フィクスチャ ファイルまたはオブジェクトのディレクトリもロードします。

于 2011-07-13T09:36:14.917 に答える
2

最近、同期モードで非同期関数を呼び出すために、 wait.forという単純な抽象化を作成しました (ファイバーに基づく)。それは初期段階ですが、機能します。次の場所にあります。

https://github.com/luciotato/waitfor

wait.forを使用すると、ノードのイベント ループをブロックすることなく、標準の nodejs 非同期関数を同期関数のように呼び出すことができます。必要なときに順次コーディングできます。

コードは次のようになります。

//in a fiber
function setup(callback) {

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

  // Load the fixtures
  var data = wait.for(fs.readFile,'./fixtures/account.json', 'utf8');

  var jsonData = JSON.parse(data);
  jsonData.forEach(function(json) {
    var account = new Account(json);
    wait.forMethod(account,'save');
  }
  callback();
}
于 2013-08-23T01:06:50.020 に答える
2

一般的な非同期パターン (シリアルおよびパラレル) とそれらを解決する方法について話しました。

https://github.com/masylum/i-love-async

役に立つことを願っています。

于 2011-07-13T16:10:14.273 に答える
0

underscore.jsプロジェクトのどこかで既に使用している場合は、このafterメソッドを活用できます。事前に非同期呼び出しがいくつあるかを知る必要がありますが、それ以外は非常に洗練されたソリューションです。

于 2011-07-25T13:10:31.953 に答える
0

多かれ少なかれ、それは実際にそれを行う適切な方法です。そこで行っているのは、並列ループです。必要に応じて、それを独自の「非同期並列 foreach」関数に抽象化できます (そして多くの場合) が、並列ループを実行する唯一の方法です。

意図に応じて、別の方法で実行できることの 1 つは、エラー処理です。スローしているため、単一のエラーがある場合、そのコールバックは実行されません (デクリメントcountされません)。したがって、次のようにする方がよい場合があります。

account.save(function(err) {
  if (err) return callback(err);
  if (!--count) callback();
});

そして、コールバックでエラーを処理します。それは、ノードの慣習的に優れています。

countまた、反復ごとにインクリメントする手間を省くために、別のことも変更します。

var jsonData = JSON.parse(data)
  , count = jsonData.length;

jsonData.forEach(function(json) {
  var account = new Account(json);
  account.save(function(err) {
    if (err) return callback(err);
    if (!--count) callback();
  });
});
于 2011-07-13T06:42:19.390 に答える