Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么猫鼬';s JavaScript在同一行中有返回和回调吗?_Javascript_Node.js_Mongodb_Callback_Mongoose - Fatal编程技术网

为什么猫鼬';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()

把回报和回调放在一起是真的吗?把回报和回调放在一起是真的吗?回答得好,大师!回答得很好,大师!