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

时间:2015-10-08 04:15:00

标签: javascript node.js mongodb callback mongoose

我正在学习猫鼬和回调。我认为回调用于代替回报,所以它既可以回调也可以回报,但不能同时回复。然后我偶然发现了这一点,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搜索并发现了这个问题,其中两个答案都有回调,但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);
}

3 个答案:

答案 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我找不到包含回报的理由。总而言之,无论如何,我都会拥有它,因为它不会受到伤害,这就是猫鼬记录它的方式。