同时进行异步(并行)操作
通常,你需要并行执行异步操作。在 async
/ await
提案中有直接的语法支持这一点,但由于 await
将等待一个承诺,你可以在 Promise.all
中将多个 promises 包装在一起等待它们:
// 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.
}
这将执行每个查询以连续地获取每个朋友的帖子,但它们可以同时完成:
// 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.
}
这将遍历 ID 列表以创建 promises 数组。await
将等待所有承诺完成。Promise.all
将它们组合成一个单一的承诺,但它们是并行完成的。