【问题标题】:Get returned value from async function using async library使用异步库从异步函数获取返回值
【发布时间】:2014-01-29 21:12:17
【问题描述】:

所以,我使用 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;
    };
}); 

但问题是,当我向菜单集合添加一些数据时,该函数不知道正在填充菜单。要查看新 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({});

感谢您的回答。

【问题讨论】:

    标签: node.js asynchronous express


    【解决方案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.

    【讨论】:

    • 我没有 res, req 因为它是 app.locals 函数。我在 ejs 模板中使用它。我想在网站的任何地方使用它而无需请求。
    • 我不明白您为什么不想使用res.locals 而不是app.locals。您的ejs 模板也可以使用它。唯一的区别是res.locals 的范围是请求,app.localsapp.locals 是整个应用程序的全局范围。
    • 我尝试了您的建议,但它不起作用。这是错误 - buildMenuStructure 未定义。
    猜你喜欢
    • 2018-04-09
    • 2022-01-14
    • 2018-01-03
    • 1970-01-01
    • 2020-09-12
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多