JavaScript's async and await keywords provide a syntactic sugar over Promises, making asynchronous code look and behave more like synchronous code. This readability improvement reduces the 'callback hell' or 'pyramid of doom' often associated with nested Promises.
Basic Conversion
An async function always returns a Promise. The await keyword pauses the execution of the async function until the Promise is resolved.
Error Handling
Unlike Promise chains which use .catch(), async/await uses standard try/catch blocks. This unifies error handling for both synchronous and asynchronous code within the same function scope.
Sequential vs. Parallel
A common pitfall is accidentally making independent requests sequential, which hurts performance.
For-Await-Of
When dealing with async iterables (like streams) or arrays of Promises, for-await-of allows you to iterate and await each item cleanly.