Async Basics
A Promise is an object that represents the eventual completion (or failure) of an asynchronous operation.
Key Concept: Think of a promise as an IOU - it promises to give you a value in the future, either successfully or with an error.
Initial state - the operation is still in progress
The operation completed successfully
The operation failed with an error