A programação assíncrona permite que as operações sejam executadas em segundo plano, sem bloquear a interface do usuário.
Em JavaScript, a programação assíncrona é implementada usando callbacks, promises ou async/await.
Os callbacks são funções que são passadas como argumentos para outras funções. Sendo assim, quando a operação assíncrona é concluída, a função de callback é chamada, permitindo que o código continue a ser executado.
Em vez de passar uma função de callback para uma operação assíncrona, é retornada uma Promise que representa a operação. As Promises são uma abstração em cima dos callbacks.
Com async/await, podemos escrever código assíncrono de maneira síncrona, o que torna o código mais fácil de entender e depurar. O async/await é suportado em todos os principais navegadores e no Node.js.