【问题标题】:Node.js: How to properly return an object from within a callback?Node.js:如何从回调中正确返回对象?
【发布时间】:2012-02-02 15:00:49
【问题描述】:

我还在纠结回调。

从回调函数中定义/返回对象的正确方法是什么?

下面sn-p可以看到我的2个console.logs,callback外面的那个当然是undefined,怎么定义呢?

在我的 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); 
      });
  }
};

【问题讨论】:

  • 我也有同样的问题,发现this很有用。

标签: node.js callback express


【解决方案1】:

您不应该这样做。回调应该是异步的,所以调用 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});
    });
  });

【讨论】:

  • 对,这就是我最初所做的,当然工作正常。从严格的“理论”的角度来看,我遇到的问题是,这将在我的应用程序中作为一个小部件在许多地方被重用。所以它实际上是由局部渲染的。通过将主页的 res.render 卡在这个可能会或可能不会用于任何给定路线的低级辅助函数调用中,它只是不会“感觉”正确。只是感觉它应该独立于主流。有意义吗?
  • 您不必使用匿名函数内联。如果这是将在其他地方重用的东西,那么创建一个命名函数并将其传递给 app.get 。 app.get('/games', requireAuth, renderGamesList);
  • @k00k 您可以查看promises,这样您就可以将 res.render 保留在辅助函数之外。
猜你喜欢
  • 2020-08-14
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 2015-09-12
相关资源
最近更新 更多