Node.js:如何从回调中正确返回对象?

Posted

技术标签:

【中文标题】Node.js:如何从回调中正确返回对象?【英文标题】:Node.js: How to properly return an object from within a callback? 【发布时间】: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很有用。 【参考方案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 保留在辅助函数之外。

以上是关于Node.js:如何从回调中正确返回对象?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 中的回调地狱

如何返回 Node.js 回调

如何在Node.js的回调中正确测试代码?

如何在 Node.js 流回调中聚合从异步函数生成的 Promise?

从 node.js 返回文件的解析输出

从回调返回值或在 node.js 中的特定回调之外访问它?