Convert Callbacks and Promise Chains to async/await
Promise chains with nested .then() calls and old-style callbacks are perfectly valid JavaScript — but they're painful to read and extend. Claude can modernise them in seconds without changing behaviour.
// Before: tangled promise chain
function fetchUserData(userId) {
return getUser(userId)
.then(user => {
return getOrders(user.id)
.then(orders => {
return { user, orders }
})
})
.catch(err => console.error(err))
}
Ask Claude: "Refactor this to use async/await with proper error handling."
// After: flat and readable
async function fetchUserData(userId) {
try {
const user = await getUser(userId)
const orders = await getOrders(user.id)
return { user, orders }
} catch (err) {
console.error(err)
}
}
Claude handles edge cases that trip up naive refactors: Promise.all() patterns that should stay parallel, .finally() blocks, error propagation differences, and callback-style Node APIs that need wrapping in promisify.
You can give it an entire file or module and ask it to convert everything in one pass — it'll flag any cases where the refactor might change behaviour and explain why.
Async/await isn't just syntactic sugar — cleaner async code means fewer subtle race conditions and much easier debugging.
Log in to leave a comment.
The /security-review command scans your uncommitted changes for injection vectors, auth gaps, hardcoded secrets, and other common vulnerabilities.
The SessionStart hook fires when any session begins or resumes, making it ideal for loading environment variables and running one-time setup scripts.
Ask Claude to write property-based tests for your functions using fast-check — it identifies the mathematical invariants in your code and generates tests that cover inputs you'd never enumerate by hand.