为什么Mongoose的JavaScript在同一行中有一个返回和一个callback?

我正在学习mongoose和callback。 我认为callback是用来代替回报,所以它是callback或回报,但不是两个。 然后我偶然发现了这一点,那里的returncb在同一行。

 // 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 }); 

我search了一下,发现这个问题有两个回答,两个callback,但一个没有回报,和一个 。 他们都是对的吗? 如果是这样, 我应该什么时候callback一个callback?

没有回报:

 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); } 

通常在asynchronous编程技术中,在特定点处使用return语句和callback是一个好习惯。 例如,当代码有进一步的下一个callback。 这可以防止在同一个函数中意外执行多个callback。

这是一个非常简单的例子:

 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); } } 

在这种情况下,如果有错误,第一个callback肯定会被调用,但是第二个callback也可能被同时调用。 所以控制台输出可能是:

 Failed Success 

为了防止这种情况,只需在failureCallback中添加一个return语句即可:

 var asyncFunction = function(failureCallback, successCallback) { getDataFromDb(err, data) { if(err) { return failureCallback(err); } successCallback(data); } } 

因此,你不能只使用return或者callback而不是两个。 事实上在某些情况下,你必须一起使用它们。

所有这一切都可以这么说,对于你的mongoose的例子来说,这可能是这个function的一个要求(虽然看起来不是这样),但它也可能是原作者习惯的一种力量,与callback一起使用回报。 根据上下文,两者都是正确的。 在这些使用情况下使用return可能是必要或不必要的预防措施。

在同一行上的返回和callback是“强制”程序从你的函数返回。 如果你只是使用callback,以后的代码有时候仍然会被执行。

例:

 someAsyncFunction(err, data) { if(err){ return callback(err) } /* do some code with your data */ callback() 

这是一个有趣的差异。 通常,callback函数被用作返回值的替代品,但是在获得额外的返回值时通常没有任何技术上的错误 – Mongoose可能会忽略返回的数据。

我的猜测是,回报是为了与不使用callback的其他方法保持一致。 如下所示:

 personSchema.virtual('name.full').get(function () { return this.name.first + ' ' + this.name.last; }); 

拿这一点盐 – 在我的searchMongoose代码库我找不到任何理由包括返回。 总而言之,无论如何,我会拥有它,因为它不会受到伤害,这就是mongoose如何logging它。