Often you will want to perform asynchronous operations in parallel. There is direct syntax that supports this in the async
/await
proposal, but since await
will wait for a promise, you can wrap multiple promises together in Promise.all
to wait for them:
// Not in parallel
async function getFriendPosts(user) {
friendIds = await db.get("friends", {user}, {id: 1});
friendPosts = [];
for (let id in friendIds) {
friendPosts = friendPosts.concat( await db.get("posts", {user: id}) );
}
// etc.
}
This will do each query to get each friend's posts serially, but they can be done simultaneously:
// In parallel
async function getFriendPosts(user) {
friendIds = await.db.get("friends", {user}, {id: 1});
friendPosts = await Promise.all( friendIds.map(id =>
db.get("posts", {user: id})
);
// etc.
}
This will loop over the list of IDs to create an array of promises. await
will wait for all promises to be complete. Promise.all
combines them into a single promise, but they are done in parallel.