簡體   English   中英

為什么Mongoose的JavaScript在同一行中既有返回又有回調?

[英]Why does Mongoose's JavaScript have both a return and a callback in the same line?

我正在學習貓鼬和回調。 我以為使用回調代替了返回,所以要么是回調,要么是返回,但不能同時使用。 然后我偶然發現了這一點,其中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
});

我在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM