非同期関数をシリアルに呼び出す方法に少し苦労しています。特に、データベースへのマングース呼び出しを組み込んだ関数。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.');
}
});
};
};