我正在尝试访问我的两个函数中的变量,但我没有回复任何东西。我做错了什么?我该如何解决?
所以这就是我的代码:
exports.show = function(req, res) {
var next_id;
var prev_id;
Article.find({'created':{$gt:req.article.created}}).sort('-created').limit(1).exec(function(err, articles) {
if (!err && articles[0] !== undefined) {
next_id = articles[0].id; // trying to get this variable
}
});
Article.find({'created':{$lt:req.article.created}}).sort('-created').limit(1).exec(function(err, articles) {
if (!err && articles[0] !== undefined) {
prev_id = articles[0].id; // and this variable
}
});
res.jsonp({article : req.article, next_href : next_id, prev_href : prev_id});
};
答案 0 :(得分:0)
我同意@thefourtheye。它可能是异步的。您可以使用异步库,例如 node-async 或 promise 库。但在这种情况下,如果你想在没有库的情况下这样做,你只需要嵌套你的方法,以确保下一步只在上一步完成后执行。
exports.show = function(req, res) {
var next_id;
var prev_id;
Article.find({'created':{$gt:req.article.created}}).sort('-created').limit(1).exec(function(err, articles) {
if (!err && articles[0] !== undefined) {
next_id = articles[0].id; // trying to get this variable
}
Article.find({'created':{$lt:req.article.created}}).sort('-created').limit(1).exec(function(err, articles) {
if (!err && articles[0] !== undefined) {
prev_id = articles[0].id; // and this variable
}
res.jsonp({article : req.article, next_href : next_id, prev_href : prev_id});
});
});
};
所以第1步是查找next_id。调用exec
方法时(在异步请求之后),您可以继续执行步骤2,即查找prev_id。调用exec
方法后,您就知道已完成并可以返回值res.jsonp(...)
。
异步库在这里很有用,因为这种方法会使事情迭代运行,这意味着第二个请求(prev_id)将在第一个请求(next_id)完成之后才会启动。您可以并行运行异步请求并等待两个请求完成,然后设置res.jsonp
响应。 Here's a sample article using node-async