为什么猫鼬';s JavaScript在同一行中有返回和回调吗?
我正在学习猫鼬和回调。我认为回调是用来代替返回的,所以不是回调就是返回,但不是两者都有。然后我偶然发现了这一点,为什么猫鼬';s JavaScript在同一行中有返回和回调吗?,javascript,node.js,mongodb,callback,mongoose,Javascript,Node.js,Mongodb,Callback,Mongoose,我正在学习猫鼬和回调。我认为回调是用来代替返回的,所以不是回调就是返回,但不是两者都有。然后我偶然发现了这一点,返回和cb在同一行 // define a schema var animalSchema = new Schema({ name: String, type: String }); // assign a function to the "methods" object of our animalSchema animalSchema.methods.findSimilarType
返回
和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
});
我在谷歌上搜索了一下,发现这个问题有两个答案,两个答案都是回调,但都是返回,还有。他们都对吗?如果是这样的话,我应该在什么时候用回调进行报税?
无需返回:
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);
}
以回报:
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);
}
这是一个有趣的区别。通常,回调被用作返回的替代,但在技术上,提供额外的返回通常没有什么错——Mongoose可能会忽略返回的数据 我的猜测是,返回的存在是为了与其他不使用回调的方法保持一致。例如:
personSchema.virtual('name.full').get(function () {
return this.name.first + ' ' + this.name.last;
});
恕我直言,我找不到任何理由包括退货。总之,无论如何,我都会拥有它,因为它不会伤害我,这就是猫鼬记录它的方式。这是一个有趣的区别。通常,回调被用作返回的替代,但在技术上,提供额外的返回通常没有什么错——Mongoose可能会忽略返回的数据 我的猜测是,返回的存在是为了与其他不使用回调的方法保持一致。例如:
personSchema.virtual('name.full').get(function () {
return this.name.first + ' ' + this.name.last;
});
恕我直言,我找不到任何理由包括退货。总之,无论如何,我都会使用它,因为它不会有任何伤害,这就是mongoose记录它的方式。通常在异步编程技术中,在特定点使用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
为了防止出现这种情况,只需向failureCallback添加一条return语句:
var asyncFunction = function(failureCallback, successCallback) {
getDataFromDb(err, data) {
if(err) {
return failureCallback(err);
}
successCallback(data);
}
}
因此,并非只能使用return或callback,而不能同时使用两者。事实上,在某些情况下,您必须同时使用它们
所有这些都表明,在Mongoose示例中,这可能是函数的一个要求(尽管看起来不是这样),但也可能是原始作者习惯性地使用return和callback。根据上下文,两者都是正确的。在这些用例中,使用return可能是必要的,也可能是不必要的预防措施。通常在异步编程技术中,在特定点使用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
为了防止出现这种情况,只需向failureCallback添加一条return语句:
var asyncFunction = function(failureCallback, successCallback) {
getDataFromDb(err, data) {
if(err) {
return failureCallback(err);
}
successCallback(data);
}
}
因此,并非只能使用return或callback,而不能同时使用两者。事实上,在某些情况下,您必须同时使用它们
所有这些都表明,在Mongoose示例中,这可能是函数的一个要求(尽管看起来不是这样),但也可能是原始作者习惯性地使用return和callback。根据上下文,两者都是正确的。在这些用例中,使用return可能是必要的,也可能是不必要的预防措施。如果在同一行上使用return和callback,您将“强制”程序从函数返回。如果您只是使用回调,之后的代码有时仍然会被执行 例如:
someAsyncFunction(err, data) {
if(err){
return callback(err)
}
/* do some code with your data */
callback()
当返回和回调在同一行时,您正在“强制”程序从函数返回。如果您只是使用回调,之后的代码有时仍然会被执行 例如:
someAsyncFunction(err, data) {
if(err){
return callback(err)
}
/* do some code with your data */
callback()
把回报和回调放在一起是真的吗?把回报和回调放在一起是真的吗?回答得好,大师!回答得很好,大师!