0

非同期関数をシリアルに呼び出す方法に少し苦労しています。特に、データベースへのマングース呼び出しを組み込んだ関数。2つのメソッドを含むクラス定義があります。(MovieFile.exists)特定のレコードがデータベースに存在するかどうかを確認します。(MovieFile.save)はデータベースにレコードを保存します。理想的には、レコードがデータベースに存在するかどうかを確認した後(MovieFile.exists())、レコードを保存できるようにしたい(MovieFile.save())。

理想的には、次のようなことをしたいと思います。

// Create instance of MovieFile object.  
var movieFile = new MovieFile(mongoose);
if (movieFile.exists() === false) {
  movieFile.save();
}

残念ながら、マングースの非同期性により、これは不可能です。私はステップ非同期の制御フローフレームワークで遊んでいます。残念ながら、この場合、そのようなフレームワークの使用方法について頭を悩ませることはできません。上記のコードをStepまたはAsyncに入れる方法を誰かに教えてもらえれば幸いです。問題は、非同期のマングース呼び出し自体がメソッド内に埋め込まれていることだと思います(MovieFile.existsおよびMovieFile.saveを参照)。この例では、このようなフレームワークを使用するのはやり過ぎかもしれませんが、これを学習演習として使用しようとしています。

function MovieFile(mongoose) {
  var Movie = mongoose.model('Movie');

  this.exists = function() {
    // Confirm necessary object variables have been set.
    if (typeof this.originalFileName === 'undefined') {
      throw error = new Error('Variable originalFilename has not been set for MovieFile.');
    }
    if (typeof this.fileSize !== 'number') {
      throw error = new Error('Variable originalFilename has not been set for MovieFile.');
    }
    // Check database for existing record.
    Movie
      .find({ originalFileName: this.originalFileName, size: this.fileSize })
      .exec(function(error, results) {
        if (error) {
          throw error;
        }
        else if (results.length === 0) {
          return false;
        }
        else if (results.length === 1) {
          return true;
        }
        else {
          throw error = new Error('More than one record for this movie record exists.');
        }
      });
  };

  this.save = function() {
    // save movie to database.
    var values = {
      name: this.getName(),
      machineFileName: this.getMachineFileName(),
      originalFileName: this.getName(),
      size: this.getFileSize(),
    };
    var movie = new Movie(values);
    movie.save(function(error, data) {
      if (error) {
        console.log(error);
      }
      else {
        console.log('Movie saved.');
      }
    });
  };
};
4

1 に答える 1

2

ブール値またはexistsを返すコールバックを関数に渡す必要があります。truefalse

例:

this.exists = function(callback) {

   // your code

   callback(true);

}); 

それで :

movieFile.exists(function(exists) {

     if (!exists) boomovieFile.save();

});

あなたが言ったように、これは非同期のマングース呼び出しによるものです。returnそのため、ステートメントをコールバックに置き換える必要があります。

Step または Async 制御フロー フレームワークを使用したことはありません。しかし、この種の単純なケースでは、これらのモジュールに依存する必要はないと思います。私の意見では、多くのコールバックを処理する必要がある場合にのみ、これらのモジュールの使用を検討する必要があります。

編集

私はフロー フレームワークを制御するのが初めてなので、コンセプトを詳しく説明し、独自の構築方法を示すこの記事を見つけました。それは学習目的に最適です。

この記事では、async モジュールを使用してキューを管理する方法の例を示します。

この投稿では、いくつかの例を挙げて、他の制御フロー モジュールをいくつかリストします。最初の回答は、小さな関数を分離することにより、ネストされたコールバックを回避する方法も示しています。これは、私が自分のアプリを個人的に管理する方法であり、私の場合は非常にうまく機能しています。

しかし、制御フローのテクニックについてもっと知りたいと思っているので、素晴らしいリソースを見つけたら教えてください。

于 2012-07-05T08:04:19.497 に答える