async functions with await is generally easier to use. You can await anything that returns a promise. The interfaces are usually cleaner than the callback syntax often used. Also worth exploring is for await with async generators, not very common but very nice with the latest node in dealing with streams vs. trying to shoehorn pipes (another issue).
In the end, async/await syntax is *MUCH* easier to follow and understand. There are just two things to be aware of. First, is that an async function returns a promise, if you return SomePromise
inside an async function, it will resolve within the construct of that promise. Second, you can await any promise, this includes other async function responses as well as anything returning a promise. I would add in a Third, other stuff may run in between the promise starting and resolving, but this is true of promises anyway.
I often add the following in a file in case I want to delay a little in async functions…
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
This lets me insert await delay(1000)
or some other number where I want to delay something a bit easier…
For more, the playground demo in the MDN documentation is enough to get started.
This 2ality post, is also pretty good. For a more thorough primer.