2014-03-05 71 views
0

我试图访问我的两个函数内的变量,但我没有收回任何东西。我在做什么错&我该如何解决它?NodeJS/Javascript:从函数访问变量


因此,这里是我的代码是什么样子:

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

'Article.find'异步吗? – thefourtheye

+0

@thefourtheye我真的不确定(我是NodeJS的新手,并且仍然是Javascript中的新手) – goo

回答

0

我@thefourtheye同意。这可能是异步的。您可以使用异步库,如节点异步承诺库。但是在这种情况下,如果您想在没有库的情况下执行此操作,则只需嵌套您的方法以确保下一步仅在上一步完成后才执行。

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方法时(在异步请求之后),您可以继续前进至查找prev_id的第2步。当调用exec方法时,您知道您已完成并可返回值res.jsonp(...)

一个异步库在这里很有用,因为这个方法使得迭代运行,这意味着第二个请求(prev_id)在第一个请求(next_id)完成之前不会启动。您可以并行运行异步请求,并等待两个请求完成,然后设置您的res.jsonp响应。 Here's a sample article using node-async

+0

是的,这实际上是我想要做的,但是想要等待有更好的方法。另外,thx为异步链接 – goo