You might have been using async/await fluently in your programs. But once in a while, you still see glimpses of Promises. For example, when waiting for multiple asynchronous calls to finish with Promise.all(). You might be wondering what's the relationship between Promises and async/await.
You can revisit the relationship between callbacks and Promises in this article.
Invocation of async function returns Promise
The first nugget of knowledge is that the invocation of an async function returns a Promise.
You can await result of Promise
You can await a Promise. Your piece of code returns control back to the system. In the meantime, other parts of your program can execute. When the Promise you awaited upon settles, the runtime will continue executing your code. In case the Promise rejects, execution continues from the nearest catch-block or .catch()-handler.
The restriction is that you have to be inside an async function. You're also allowed to do this on the top level when TC39 proposal top-level-await lands in Node.
await equivalent of .then()
Promises and async/await are interchangeable. Whenever you see an await-statement, you can replace it with a .then(). This is a good exercise to play in your mind when reasoning about code containing both constructs. But, when talking about program-wide conventions, it's advisable to stick to one consistently.
Similarly, .catch() is the equivalent of a catch-block.