传递js -model结果集变量范围

时间:2017-02-14 10:33:11

标签: node.js sails.js waterline

有人可以向我解释为什么我无法将booksCount变量保存到用户json对象中吗?这是我的代码

for(var user in users){
    Books.count({author: users[user]['id']}).exec(function(err, count){
        users[user]['booksCount']=count;
        });
    }
return res.view('sellers', {data: users});

其中Users是表中用户的列表,这是User.find()方法的直接结果。用户就是模特。

现在,如果我尝试在for循环中打印用户[user] ['booksCount'],它可以正常工作。但当它超出for循环时,变量消失在空气中。控制台打印'undefined'在外面循环。

1 个答案:

答案 0 :(得分:1)

因为Books.count是一个API调用,并且所有API调用都是异步的所以在

for(var user in users){
    // It Will call the Books.count and leave the callback Function without waiting for callback response.
    Books.count({author: users[user]['id']}).exec(function(err, count){ 
       users[user]['booksCount']=count;
    });
}
//As callback result didn't came here but the controll came here
// So, users[user] will be undefined here
return res.view('sellers', {data: users});

使用承诺:

async.forEachOf(users, function (value, user, callback) {
    Books.count({author: users[user]['id']}).exec(function(err, count){ 
           users[user]['booksCount']=count;
           callback(err);
         // callback function execute after getting the API result only
        });
}, function (err) {
    if (err) return res.serverError(err.message); // Or Error view
    // You will find the data into the users[user]
    return res.view('sellers', {data: users});
});