A structured way to represent a value that isn't ready yet.
A Promise represents an eventual result — pending until it either resolves with a value or rejects with a reason, and once it settles, it can never change state again. That last part matters more than it sounds: because a settled promise is immutable, chaining .then() handlers is safe and predictable, unlike passing callbacks around, where nothing guarantees a callback only fires once.
The real value of Promises is in composition. Promise.all() waits for every promise to resolve and fails fast on the first rejection; Promise.allSettled() waits for all of them regardless of outcome and gives you each result or error; Promise.race() and Promise.any() resolve based on whichever promise finishes first, with subtly different rules on rejection. async/await is built entirely on top of this same Promise machinery — it's syntax that makes chained .then() calls read like synchronous code, not a separate concurrency model.
What you'll walk away knowing