Async/Await
// async function always returns a promise\nasync function getUser(id) {\n const response = await fetch(`/api/users/${id}`);\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n return response.json();\n}\n\n// Clean sequential flow\nasync function loadDashboard(userId) {\n try {\n const user = await getUser(userId);\n const posts = await getPosts(user.id);\n const notifications = await getNotifications(user.id);\n \n return { user, posts, notifications };\n } catch (err) {\n console.error('Dashboard load failed:', err);\n throw err;\n }\n}
Error Handling Patterns
// Try/catch wrapper\nasync function safeAsync(fn) {\n try {\n return [await fn(), null];\n } catch (err) {\n return [null, err];\n }\n}\n\n// Usage\nconst [data, error] = await safeAsync(() => fetchData());\nif (error) {\n console.error('Failed:', error.message);\n} else {\n console.log('Data:', data);\n}\n\n// Promise.allSettled - handle all results\nconst results = await Promise.allSettled([\n fetch('/api/a'),\n fetch('/api/b'),\n fetch('/api/c'),\n]);\n\nfor (const result of results) {\n if (result.status === 'fulfilled') {\n console.log('Success:', result.value);\n } else {\n console.warn('Failed:', result.reason.message);\n }\n}