So sánh 4 combinators của Promise:
javascript
const p1 = fetch('/api/a');
const p2 = fetch('/api/b');
// all(): fail-fast nếu có 1 reject
const [a, b] = await Promise.all([p1, p2]);
// race(): lấy kết quả đầu tiên (fulfilled hoặc rejected)
const first = await Promise.race([p1, p2]);
// allSettled(): chờ tất cả, không reject
const results = await Promise.allSettled([p1, p2]);
// results[0] = { status: 'fulfilled', value: ... }
// results[1] = { status: 'rejected', reason: ... }
// any(): fulfilled đầu tiên, reject chỉ khi tất cả reject
const fastest = await Promise.any([p1, p2]);