嗨,我正在尝试访问猫鼬中的查找返回的元素,并且在异步和回调情况下遇到了一些麻烦。

这是用于更好理解的代码。

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可以做到这一点,但我发现回调是处理此问题的更简便方法。)

09-25 18:39