2017-02-14 3 views
2

Может кто-нибудь объяснить мне, почему я не могу сохранить переменную booksCount в объекте user json? Вот мой кодSails js -model resultset variable scope

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}); 

Где Пользователи список пользователей из таблицы, которая является прямым результатом метода User.find(). Пользователь - модель.

Теперь, если я пытаюсь напечатать пользователей [user] ['booksCount'] внутри цикла for, он отлично работает. Но когда он выходит за пределы цикла, переменная исчезает в воздухе. Консоль печатает 'undefined' out для цикла.

+2

Потому что вы делаете это асинхронным. Почему вы не просто заполняете книги пользователя при получении всех пользователей? – orhankutlu

+0

Это то, что я сделал, 1) извлечение всех списков авторов из книг. 2) Заполнение массива пользователей. 3) Найдите количество книг для каждого из них. Нет таблицы авторов. Пользователь также может быть автором. Вот почему я сделал это так. – Carmen

+0

Спасибо, позвольте мне посмотреть, что я могу сделать здесь – Carmen

ответ

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}); 
}); 
+0

Это так, спасибо – Carmen