An Async function returns a promise immediately, so whats the difference between this and a normal promise? the main one is that you can use something call await, this await call will pause the promise until is resolved, after that it will return the resloved value, if not, it will reject the promise.
Going deeper with the previous example
Notice how on the addAnotherBoy function we have to run the await messageAfter2Seconds() alone so the second message can be print after the first one ( 2 seconds ), the code allow us to read syncronus even though everything is happening asynchronous, is more clear and readable.
Let's do an api call
I'll use the popular library axios to make things a bit easier
With async await things look clearer and easier
We off course need to take care of errors in case something goes wrong, with async function we can use try and catch staments which by the way is something that is not possible to use with plain promises because they are allways invoque asynchronous
Calling multiple promises
Sometimes we need to call multiple promises, wanting them to show at the same time, but how can we do that if they take a different amount of times to resolve? We can use something call Promise.all combine with async await, which ever finish last would be the final amount of time.