2012-01-04 85 views
4

仍圍繞着回調包裹我的頭。Node.js:如何正確地從回調中返回一個對象?

從回調函數中定義/返回對象的正確方法是什麼?

你可以在下面的代碼片段中看到我的2 console.logs,回調之外的一個當然是未定義的,我該如何定義它?

在我app.js:

var tools = require('../models/tools.js'); 
    app.get('/games', requireAuth, function (req, res) { 
    var gameqlist = tools.getMyGameQs(req, function(err, gameqlist){ 
     console.log(gameqlist); // this is properly defined 
     return gameqlist; // not quite right 
    }); 
    console.log(gameqlist); // this is undefined 
    res.render('games', {title:'Your Games!', gameqlist : gameqlist}); 


    }); 

我有以下的效用函數的正常工作:

var Gameq = require('../models/gameq'); 

module.exports = { 
    getMyGameQs: function (req, callback){ 
    // find all game queues that a user is in 
    Gameq 
     .find({ 
       'game.players.player_id' : req.user.id 
       }) 
     .asc('created_at') // sort by date - get oldest first 
     .run(function(err, gameqlist) { 
     if(!gameqlist){ 
      err = 'You are not in any games.'; 
     } 
     return callback(err, gameqlist); 
     }); 
    } 
}; 
+0

我有同樣的問題,並發現[此](https://stackoverflow.com/questions/25807786/separating-daos-from-controllers-for-reusability-purposes)是有用的。 – arymeo 2014-09-12 19:43:23

回答

4

你不應該想這樣做:

tools.js 。回調應該是異步的,所以有可能在調用getMyGameQs之後的代碼在回調之前被執行。

你應該從回調中調用「res.render」。

var tools = require('../models/tools.js'); 
    app.get('/games', requireAuth, function (req, res) { 
    var gameqlist = tools.getMyGameQs(req, function(err, gameqlist){ 
     res.render('games', {title:'Your Games!', gameqlist : gameqlist}); 
    }); 
    }); 
+0

對,這就是我原來的做法,當然可以。從嚴格的「理論」角度來看,我遇到的問題是,這將在許多地方作爲小工具在整個我的應用程序中重用。所以它實際上是由部分渲染的。它只是干擾主頁面的res.render內部的這個低幫助函數調用,它可能會或可能不會被用於任何給定的路由,都不會「感覺」正確。它只是覺得它應該獨立於主流。合理? – k00k 2012-01-04 18:33:14

+2

您不必使用內聯的匿名函數。如果這是其他地方可以重用的東西,那麼創建一個命名函數並將其傳遞到app.get。 app.get('/ games',requireAuth,renderGamesList); – 2012-01-04 22:15:02

+0

@ k00k你可以看看[promises](http://stackoverflow.com/questions/4296505/understanding-promises-in-node-js),這樣你就可以將res.render保留在輔助函數之外。 – nxt 2012-01-05 06:49:50