I am trying to iterate thru array of objects and add some stuff inside these objects using async function in Node.js.
So far my code looks like:
var channel = channels.related('channels');
channel.forEach(function (entry) {
knex('albums')
.select(knex.raw('count(id) as album_count'))
.where('channel_id', entry.id)
.then(function (terms) {
var count = terms[0].album_count;
entry.attributes["totalAlbums"] = count;
});
});
//console.log("I want this to be printed once the foreach is finished");
//res.json({error: false, status: 200, data: channel});
How can I achieve such a thing in JavaScript?
Use async.each
async.each(channel, function(entry, next) {
knex('albums')
.select(knex.raw('count(id) as album_count'))
.where('channel_id', entry.id)
.then(function (terms) {
var count = terms[0].album_count;
entry.attributes["totalAlbums"] = count;
next();
});
}, function(err) {
console.log("I want this to be printed once the foreach is finished");
res.json({error: false, status: 200, data: channel});
});
The final callback will be called when all entries are processed.
Since you are already using promises, better not to mix that metaphor with async. Instead, just wait for all the promises to finish:
Promise.all(channel.map(getData))
.then(function() { console.log("Done"); });
where getData is:
function getData(entry) {
return knex('albums')
.select(knex.raw('count(id) as album_count'))
.where('channel_id', entry.id)
.then(function (terms) {
var count = terms[0].album_count;
entry.attributes["totalAlbums"] = count;
})
;
}
来源:https://stackoverflow.com/questions/29178868/make-async-call-inside-foreach