![](/img/trans.png)
[英]Why does the value returned should be on the same line as the return statement in JavaScript?
[英]Why does Mongoose's JavaScript have both a return and a callback in the same line?
我正在學習貓鼬和回調。 我以為使用回調代替了返回,所以要么是回調,要么是返回,但不能同時使用。 然后我偶然發現了這一點,其中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周圍搜索,發現了這樣的問題,有兩個答案都帶有回調,但是一個沒有返回值, 一個帶有 。 他們倆都正確嗎? 如果是這樣, 我什么時候應該返回帶有回調的內容?
沒有退貨:
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);
}
通常,在異步編程技術中,最好在特定點使用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
為了防止這種情況,您只需將return語句添加到failureCallback:
var asyncFunction = function(failureCallback, successCallback) {
getDataFromDb(err, data) {
if(err) {
return failureCallback(err);
}
successCallback(data);
}
}
因此,並非只能使用return或callback,而不能同時使用兩者。 實際上,在某些情況下,您必須一起使用它們。
所有這些都說明,在您的貓鼬示例中,這可能是功能的要求(盡管看起來並非如此),但這也可能是原作者習慣於使用return和回調。 取決於上下文,兩者都是正確的。 在這些用例中,使用return可能是必要的或不必要的預防措施。
在同一行上有return和callback的情況下,您是“強制”程序從函數中返回。 如果僅使用回調,則之后的代碼有時仍會執行。
例:
someAsyncFunction(err, data) {
if(err){
return callback(err)
}
/* do some code with your data */
callback()
那是一個有趣的差異。 通常,回調被用作返回的替代品,但是通常存在多余的返回在技術上沒有錯-貓鼬可能只會忽略返回的數據。
我的猜測是,存在返回值是為了與不使用回調的其他方法保持一致。 如下所示:
personSchema.virtual('name.full').get(function () {
return this.name.first + ' ' + this.name.last;
});
帶着一點鹽- 在我的Mongoose代碼庫中,我找不到任何包含退貨的理由。 總而言之,我還是要擁有它,因為它不會造成傷害,這就是貓鼬記錄它的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.