https://mabry.dev/posts/async-javascript-explained/