我正在学习猫鼬和回调。我认为回调用于代替回报,所以它既可以回调也可以回报,但不能同时回复。然后我偶然发现了这一点,return
和cb
在同一行。
// define a schema
var animalSchema = new Schema({ name: String, type: String });
// assign a function to the "methods" object of our animalSchema
animalSchema.methods.findSimilarTypes = function (cb) {
return this.model('Animal').find({ type: this.type }, cb);
}
var Animal = mongoose.model('Animal', animalSchema);
var dog = new Animal({ type: 'dog' });
dog.findSimilarTypes(function (err, dogs) {
console.log(dogs); // woof
});
我用Google搜索并发现了这个问题,其中两个答案都有回调,但one without返回,one with。他们都是正确的吗?如果是这样,何时应该使用回调进行回报?
没有回报:
animalSchema.statics.findByName = function (name, cb) {
this.find({ name: new RegExp(name, 'i') }, cb);
}
返回:
animalSchema.methods.findSimilarTypes = function (cb) {
return this.model('Animal').find({ type: this.type }, cb);
}
答案 0 :(得分:4)
通常在异步编程技术中,最好在特定点使用return语句和回调。例如,当代码进一步向下调用时。这可以防止在同一个函数中意外执行多个回调。
这是一个非常简单的例子:
var failureCallback = function(err) {
console.log("Failed");
// do something with err
}
var successCallback = function(data) {
console.log("Success");
// do something with data
}
var asyncFunction = function(failureCallback, successCallback) {
getDataFromDb(err, data) {
if(err) {
failureCallback(err);
}
successCallback(data);
}
}
在这种情况下,如果出现错误,肯定会调用第一个回调,但也可以同时调用第二个回调。所以控制台输出可能是:
Failed
Success
为了防止这种情况,您只需在failCallback中添加一个return语句:
var asyncFunction = function(failureCallback, successCallback) {
getDataFromDb(err, data) {
if(err) {
return failureCallback(err);
}
successCallback(data);
}
}
因此,您不能只使用return或callback,而不能同时使用两者。事实上,在某些情况下,你必须一起使用它们。
所有这些都可以说,对于你的Mongoose例子,它可能是函数的一个要求(虽然看起来不是这样),但它可能也是一种习惯的力量。原作者使用return和回调。根据具体情况,两者都是正确的。在这些用例中,使用return可能是必要的或不必要的预防措施。
答案 1 :(得分:3)
在同一行上有一个返回和回调,你“强迫”程序从你的函数返回。如果您只是使用回调,之后的代码有时仍会被执行。
示例:
someAsyncFunction(err, data) {
if(err){
return callback(err)
}
/* do some code with your data */
callback()
答案 2 :(得分:0)
这是一个有趣的区别。通常,回调被用作返回的替代,但是通常没有任何技术上存在额外返回的错误 - Mongoose可能只是忽略返回的数据。
我的猜测是返回是为了与不使用回调的其他方法保持一致。如下所示:
personSchema.virtual('name.full').get(function () {
return this.name.first + ' ' + this.name.last;
});
带上一粒盐 - in my search of the Mongoose codebase我找不到包含回报的理由。总而言之,无论如何,我都会拥有它,因为它不会受到伤害,这就是猫鼬记录它的方式。