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

Node.js 使用异步库从异步函数获取返回值,node.js,asynchronous,express,Node.js,Asynchronous,Express,所以,我使用expresslocals来创建自定义函数。我有这个: 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

所以,我使用expresslocals来创建自定义函数。我有这个:

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.getMenu
函数与mongoose
Menu.find({});


感谢您的回答。

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

最好的解决方案是保留原始代码,但将其移动到express中间件中,并使用
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);
  });
})
app.use(函数(请求、恢复、下一步){
菜单。获取菜单(函数(错误,菜单){
res.locals.buildMenuStructure=function(){
var-id=[];
对于(变量i=0;i
在这种情况下,将为每个新请求重新构建
buildMenuStructure
helper


.

我没有res,req,因为它是app.locals函数。我在ejs模板中使用它。我想在没有请求的情况下在网站的任何地方使用它。我不明白为什么你不想使用
res.locals
而不是
app.locals
。你的
ejs
模板也可以使用它。唯一的区别是
res。局部变量
的作用域是请求和
应用程序。局部变量
应用程序。局部变量
是整个应用程序的全局变量。我尝试了你的建议,但无效。这是错误-未定义buildMenuStructure。
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);
  });
})