Javascript 在Mongoose之外的函数中返回数据

Javascript 在Mongoose之外的函数中返回数据,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我正在编写一个函数,希望能够返回Mongoose查询数据,以便使用它。但是,我只能在.exec函数中访问sum。我如何将它从外部获取,以便在调用函数时返回它 function get_likes(user){ var Image = require('./models/image'); var query = Image.find({'author' : user}); query.exec(function (err, collected) { if

我正在编写一个函数,希望能够返回Mongoose查询数据,以便使用它。但是,我只能在.exec函数中访问sum。我如何将它从外部获取,以便在调用函数时返回它

function get_likes(user){
    var Image = require('./models/image');

    var query = Image.find({'author' : user});
    query.exec(function (err, collected) {
        if (err) return console.error(err);

        var sum = 0;
        for(var i=0;i<collected.length-1;i++){
            sum += collected[i].like_count;
        }

        // I CAN PRINT SUM HERE
        console.log(sum);
        return sum;
    });

    // SUM DOESN'T EXIST OUT HERE.
    return sum;
}
函数获取喜好(用户){
变量图像=需要('./模型/图像');
var query=Image.find({'author':user});
exec(函数(err,collected){
if(err)返回控制台。error(err);
var总和=0;

对于(var i=0;i您不能直接执行。node.js使用回调和事件来处理其异步操作。您最好接受这一点


您可以通过采用promise库()间接实现这一点,但这只是一种伪造的同步操作。

使用回调函数进行响应

function get_likes(user, cb){
    var Image = require('./models/image')

    var query = Image.find({'author' : user});
    query.exec(function (err, collected) {
        if (err) return console.error(err);

      var sum = 0;
      for(var i=0;i<collected.length-1;i++){
            sum += collected[i].like_count;
        }

        // I CAN PRINT SUM HERE
        console.log(sum);
        cb(sum);
    });

}
函数get_likes(用户,cb){
var Image=require(“./models/Image”)
var query=Image.find({'author':user});
exec(函数(err,collected){
if(err)返回控制台。error(err);
var总和=0;

对于(var i=0;i您的get_likes函数是异步的,因此您应该有一个回调

function get_likes(user, callback){
var Image = require('./models/image');
var query = Image.find({'author' : user});
query.exec(function (err, collected) {
    if (err) return callback(err);

    var sum = 0;
    for(var i=0;i<collected.length-1;i++){
        sum += collected[i].like_count;
    }

    // I CAN PRINT SUM HERE
    console.log(sum);
    callback(null, sum);
});
}
函数get_likes(用户,回调){ 变量图像=需要('./模型/图像'); var query=Image.find({'author':user}); exec(函数(err,collected){ if(err)返回回调(err); var总和=0;
对于(var i=0;iWell,变量的作用域是
函数
,因此您可以在发送到
query.exec()的回调函数上方声明
sum
…但如果这是异步的,所有这些都无关紧要。exec函数内部的迭代不会影响sum变量。sum只是保持为0.yes。(query.exec)is和async function.sum将不可用。对不起,我将编辑答案。如何调用回调函数?作为回调参数传递什么?只需调用带有参数的函数即可。例如:调用带有参数的函数即可。在本例中,第二个参数是函数(cb)。此参数可在get likes函数内访问并调用。例如:get_likes(用户,函数(sum){//此处使用sum.});这是用回调完成的异步编程。如果你想摆脱这种回调循环,请使用承诺。关于get likes的定义,请参考我上面的答案。那么我如何调用它?我要传递给回调参数什么?get_likes(user,function(err,sum){If(!err){console.log(sum);//用sum做你想做的事}else{//处理错误}});是否确定?是否将函数作为回调传递?
function get_likes(user, callback){
var Image = require('./models/image');
var query = Image.find({'author' : user});
query.exec(function (err, collected) {
    if (err) return callback(err);

    var sum = 0;
    for(var i=0;i<collected.length-1;i++){
        sum += collected[i].like_count;
    }

    // I CAN PRINT SUM HERE
    console.log(sum);
    callback(null, sum);
});
}