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

用户名

因此,我正在使用Express Locals创建自定义函数。我有这个:

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与猫鼬相同Menu.find({});

感谢您的回答。

列昂尼德·贝斯卡斯特尼(Leonid Beschastny)

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

对您而言,最好的解决方案是保留原始代码,但将其移入快速中间件中并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将为每个新请求重新构建帮助程序。

下面是使用两者的一个例子app.locals,并res.localsexpressejs发动机

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章