使用异步库从异步函数获取返回值

时间:2014-01-29 12:04:15

标签: node.js asynchronous express

所以,我正在使用快速本地创建自定义功能。我有这个:

Menu.getMenu(function(err, menu) {
    app.locals.buildMenuStructure = function(){
        var ids = [];
        for (var i = 0; i < menu.length; i++) {
            ids.push(menu[i]._id); 
        }
        return ids;
    };
}); 

但问题是,当我向Menu集合添加一些数据时,该函数不知道正在填充的菜单。要查看新ID,我需要重新启动服务器。

现在我意识到我需要检索buildMenuStructure函数内的菜单才能立即看到效果。在这种情况下,我需要获取getMenu异步函数的值并返回它。像这样:

app.locals.buildMenuStructure = function(){
         var ids = [];
         Menu.getMenu(function(err, menu) {
              for (var i = 0; i < menu.length; i++) {
                  ids.push(menu[i]._id); 
              }
         });
         return ids;
} 

我计划使用异步库,但我无法使其工作(( 注意!这个功能得到了简化。 Menu.getMenu函数与mongoose Menu.find({});

相同

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

看起来你想同步检索异步函数的值,但这是不可能的(除非你使用光纤)。

最适合您的解决方案是保留原始代码,但要将其移至快速中间件并使用res.locals代替app.locals

app.use(function(req, res, next) {
  Menu.getMenu(function(err, menu) {
    res.locals.buildMenuStructure = function(){
      var ids = [];
      for (var i = 0; i < menu.length; i++) {
        ids.push(menu[i]._id); 
      }
      return ids;
    };
    next(err);
  });
})

在这种情况下,buildMenuStructure帮助器将为每个新请求重新构建。

Here is an example of using both app.locals and res.locals in express with ejs engine