嗨,我正在尝试访问猫鼬中的查找返回的元素,并且在异步和回调情况下遇到了一些麻烦。
这是用于更好理解的代码。
function retrieveBudgets(email, callback) {
models.User.find({email: email},{budget:true}, function(err,budgets) {
if (err) {
callback(err, null);
} else {
callback(null, budgets);
}
});
};
retrieveBudgets(user.email, function(err, budgets) {
if (err) {
console.log(err);
}
budgets.forEach(function(budget){
console.log(JSON.stringify(budget, null, 4));
});
});
因此,这行
console.log(JSON.stringify(budget, null, 4));
正常工作,并以json格式将对象打印到屏幕上,但是如何从此处将每个对象存储到对象数组中?如果我尝试在同一行推送到数组,则会收到错误消息。我已经看到一些类似的问题,但是我并没有取得任何进展。
编辑:____________________________________________________________
我做了一点修改以使其正常工作,我将res.render移到了上面,以便在回调的同时完成页面的渲染,但无论如何我都看不到这是正确的解决方案
var user=req.session.user;
res.locals.budgets=[];
function retrieveBudgets(email, callback) {
models.User.find({email: email},{budget:true}, function(err, budgets) {
if (err) {
callback(err, null);
} else {
callback(null, budgets);
}
});
};
retrieveBudgets(user.email, function(err, budgets) {
if (err) {
console.log(err);
}
res.locals.budgets = budgets.map((function(b){ return b; });
res.render('budget/budget.jade',{ csrfToken: req.csrfToken() });
});
这项工作有效,我可以通过当地人获得预算,因此对此是否有任何反馈都很好,我怀疑这样做是否正确?
最佳答案
从budgets
调用获得的retrieveBudgets
返回值已经是一个数组。
调用budgets.forEach
可以证明这一点,它是数组的一种方法。
有没有必要根据这些物品创建一个新的数组?可以很容易做到:var myNewArray = budgets.map((function(b){ return b; });
这一行代码会将原始预算数组变成一个包含每个预算项目的新数组。
还有其他创建新数组的方法,具体取决于您需要执行的操作
从下面的评论更新
我真正想做的是在查询之外使用预算,以便将其传递给视图
在这种情况下,您需要从回调中渲染视图并将预算传递给视图:
router.get("/foo", function(req, res, next){
retrieveBudgets(user.email, function(err, budgets) {
if (err) { return next(err); }
res.render('budget/budget.jade',{
budgets: budgets,
csrfToken: req.csrfToken()
});
});
});
这是完成这项工作的唯一且正确的方法。
如果您尝试执行此操作而不等待回调完成,则
budgets
数组中将没有任何数据。因此,您必须等待回调被执行,然后使用传递到视图的budgets
(或单个budget
或任何其他名称)呈现视图。(使用promise可以做到这一点,但我发现回调是处理此问题的更简便方法。)