我在如何以串行方式调用异步函数方面有点挣扎。特别是,将 mongoose 调用合并到数据库的函数。我有一个包含两种方法的类定义: (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控制流框架。不幸的是,在这种情况下,我无法理解如何使用这些框架。如果有人能告诉我如何将上述代码放入 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.');
}
});
};
};