同时进行异步(并行)操作

通常,你需要并行执行异步操作。在 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 将它们组合成一个单一的承诺,但它们是并行完成的。