Node.js:如何正确地从回调中返回一个对象?
仍围绕着回调包裹我的头。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);
});
}
};
你不应该想这样做:
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});
});
});
对,这就是我原来的做法,当然可以。从严格的“理论”角度来看,我遇到的问题是,这将在许多地方作为小工具在整个我的应用程序中重用。所以它实际上是由部分渲染的。它只是干扰主页面的res.render内部的这个低帮助函数调用,它可能会或可能不会被用于任何给定的路由,都不会“感觉”正确。它只是觉得它应该独立于主流。合理? – k00k 2012-01-04 18:33:14
您不必使用内联的匿名函数。如果这是其他地方可以重用的东西,那么创建一个命名函数并将其传递到app.get。 app.get('/ games',requireAuth,renderGamesList); – 2012-01-04 22:15:02
@ k00k你可以看看[promises](http://stackoverflow.com/questions/4296505/understanding-promises-in-node-js),这样你就可以将res.render保留在辅助函数之外。 – nxt 2012-01-05 06:49:50
我有同样的问题,并发现[此](https://stackoverflow.com/questions/25807786/separating-daos-from-controllers-for-reusability-purposes)是有用的。 – arymeo 2014-09-12 19:43:23