2012-01-04 5 views
4

まだコールバックの周りに私の頭をラッピングします。Node.js:コールバック内からオブジェクトを正しく返すには?

コールバック関数内からオブジェクトを定義/返す適切な方法は何ですか?

次のスニペットで私の2 console.logを見ることができますが、コールバック以外のものは当然定義されていません。どうすれば定義できますか?私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}); 


    }); 

私は正常に動作し、以下のユーティリティ関数があります。

tools.js:

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

答えて

4

をあなたはそれをしたくないはず。コールバックは非同期であるはずですので、コールバックの前に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

+2

匿名関数をインラインで使用する必要はありません。これが他の場所で再利用されるものなら、名前付き関数を作成し、代わりにapp.getに渡します。 app.get( '/ games'、requireAuth、renderGamesList); –

+0

@ k00k [promises](http://stackoverflow.com/questions/4296505/understanding-promises-in-node-js)を見れば、res.renderをヘルパー関数の外に保つことができます。 – nxt

関連する問題