https://medium.com/@ishahmeer/understanding-and-implementing-asynchronous-programming-in-javascript-a98f6c6285cf