# Programação Assíncrona

* setTimeout (Função assíncrona que agenda uma ação para o futuro, colocando no final do event loop do javascript, sendo executada após X milissegundos que for passado).

```javascript
console.log(1);

setTimeout(() => {
    console.log(2);    
}, 5000);

console.log(3);

// 1
// 3
// 2
```

* setInterval (Função assíncrona que executa uma ação a cada X milissegundos)

```javascript
setInterval(() => {
    console.log('Executando a cada 2 segundos');
}, 2000);
```

* callback

```javascript
const githubApi = 'https://api.github.com/users/nicollaslopes/repos' 

axios.get(githubApi).then(res => {
    console.log(res.data);
})
```

* promise

```javascript
const axios = require('axios');

(async () => {

    const githubApi = user => `https://api.github.com/users/${user}/repos` 

    console.time()
    
    const res1 = await axios.get(githubApi('nicollaslopes'));
    const res2 = await axios.get(githubApi('DanielHe4rt'));
    const res3 = await axios.get(githubApi('rmanguinho'));
    
    console.timeEnd()
})() // default: 1.997s

```

Rodando as requisições em paralelo (é útil quando as demais requisições de baixo não são dependente de alguma em cima).

```javascript
const axios = require('axios');

(async () => {

    const githubApi = user => `https://api.github.com/users/${user}/repos` 
    
    console.time()
    const p1 = axios.get(githubApi('nicollaslopes'));
    const p2 = axios.get(githubApi('DanielHe4rt'));
    const p3 = axios.get(githubApi('rmanguinho'));
    
    await Promise.all([p1, p2, p3]);

    console.timeEnd()
})() // default: 559.312ms

```

* async await

```javascript
const axios = require('axios');

(async () => {

    const githubApi = 'https://api.github.com/users/nicollaslopes/repos' 

    const result = await axios.get(githubApi);
    
    console.log(result.data);
})()
```

* Event Loop
