同時進行非同步(並行)操作

通常,你需要並行執行非同步操作。在 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 將它們組合成一個單一的承諾,但它們是並行完成的。