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