我在如何以串行方式调用异步函数方面有点挣扎。 特别是包含猫鼬对数据库的调用的函数。 我有一个类定义,其中包括两个方法:(MovieFile.exists)检查数据库中是否存在某个记录;(MovieFile.save) 将记录保存在数据库中。 理想情况下,我希望能够在确认记录(MovieFile.save())后保存记录(MovieFile.save())。
理想情况下,我想做这样的事情:
// Create instance of MovieFile object.
var movieFile = new MovieFile(mongoose);
if (movieFile.exists() === false) {
movieFile.save();
}
不幸的是,猫鼬的异步性质使这是不可能的。 我一直在使用步骤和异步控制流框架。 不幸的是,在这种情况下,我无法弄清楚如何使用此类框架。 如果有人能告诉我如何将上述代码放入步骤或异步中,我将不胜感激。我认为问题是异步猫鼬调用本身嵌入在方法中(请参阅: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.');
}
});
};
};
你必须向exists
函数传递回调,这将返回布尔true
或false
。
示例 :
this.exists = function(callback) {
// your code
callback(true);
});
然后:
movieFile.exists(function(exists) {
if (!exists) boomovieFile.save();
});
正如您所说,这是由于异步猫鼬调用。因此,您必须用回调替换return
语句。
我从未使用过步骤或异步控制流框架。但我认为,对于这种简单的情况,您不需要依赖这些模块。在我看来,只有当你必须处理很多回调时,你才应该考虑使用这些模块。
编辑
由于我是控制流框架的新手,我发现这篇文章很好地描述了这个概念,并展示了如何构建自己的框架。这对于学习目的非常有用。
本文将为您提供有关如何使用异步模块管理队列的示例。
这篇文章列出了一些其他的控制流模块,并提供了一些示例。第一个答案还展示了如何通过解耦小函数来避免嵌套回调。这就是我个人管理我的应用程序的方式,这在我的情况下效果很好。
但是我很想听到更多关于控制流技术的信息,所以如果你发现了很好的资源,请告诉我。