所以,我正在使用快速本地创建自定义功能。我有这个:
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({});
感谢您的回答。
答案 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