2016-01-06 82 views
0

我正在寫一個函數,我希望能夠返回我的Mongoose查詢數據,所以我可以使用它。但是,我只能在.exec函數中訪問sum。如何在外部獲取它,以便在函數調用時返回?在Mongoose之外的函數中返回數據

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; 
} 
+0

好,變量的作用域到'function',所以你可以聲明上面的'你要發送的回調函數sum'到'query.exec()'。 ......但如果這是異步的,那麼這些都不重要。 – Antiga

回答

1

你不能直接。 node.js使用回調和事件來處理其異步操作。你最好的選擇是接受這一點。

您可以通過採用承諾庫(http://howtonode.org/promises)間接做到這一點,但只有一種假貨同步操作。

0

使用回調函數如果正在使用它作爲API可以使用res.send({ 「和」:總和})響應

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); 
    }); 

} 

或;

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

     var query = Image.find({'author' : user}); 
     query.exec(function (err, collected) { 
      if (err) return res.status(400).send({"error":"unable to connect"}); 

      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); 
      res.status(200).send({"sum": sum}); 
     }); 

    } 

我把node/express作爲示例服務器。

+0

exec函數內部的迭代不會影響sum變量。總和仍然是0. –

+0

是的。 (query.exec)和async function.sum將不可用。請原諒。我將編輯答案。 –

+0

你如何調用回調函數?你作爲回調參數傳遞了什麼? –

0

你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); 
}); 
} 
+0

那麼我怎麼稱呼它呢?我將什麼傳遞給回調參數? –

+0

get_likes(用戶,功能(ERR,總和){ 如果(ERR){ 的console.log(總和);! //你想與和 做} 其他{// 處理您的錯誤 } }); – csaiki

+0

你確定嗎?你傳遞一個函數作爲回調? –