问题
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?
回答1:
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.
回答2:
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