Roadmap backend #7 - Síncrono x Assíncrono (async await)

Roadmap backend #7 - Síncrono x Assíncrono (async await)

Explicação préviamente alguns conceitos sobre esse tema bem importante.

Código síncrono

Código síncrono explicado a bem grosso modo é basicamente o código que é executado linha por linha, vamos dar exemplo para ficar melhor o entendimento.

Temos abaixo um código síncrono:

const showAddress = (address) => {
    console.log(address)
}
let nowAddress = {
    street: 323,
    district: 'Brooklyn'
}
showAddress(nowAddress)

let nameUser = 'John Doe';
let yearsOld = 41;

Naturalmente o Javascript vai ler a primeira linha (nameUser), depois yearsOld e address, executado de maneira síncrona. Veja que eu defino uma função para exibir um endereço qualquer, defino uma váriavel com endereço, executo a função e depois crio mais duas váriaveis quaisquer. Quando eu chamo a função showAddress ela é executada completamente para só depois passar o controle à seguinte, definindo a váriavel nameUser e yearsOld.

Código assíncrono: Contexto: Temos que resgatar do nosso banco de dados informações do usuário e para isso sabemos que ao fazer uma request o servidor tem um determinado tempo para processar a requisição, o banco também tem um tempo para resgatar os dados e depois de tudo isso nos voltar o resultado da request (response).

const getUserById = id => {
    try {
        // vou tentar pegar meus dados no banco aqui
    }.catch(error) {
        // caso tenha algum erro, vou exibi-lo aqui para poder tratar disso.
    }
}

let welcomeMessage = 'Welcome to Javascript async/sync, '

// Suponde que fizemos uma req para pegar o nome do usuário mandando o ID dele (ID = 1).
Callbacks e sua solução, as Promises
const username = getUserById(1)

// Supondo que também a função ocorreu com sucesso e nos retornou o seguinte objeto:

{
    id: 1,
    username: 'John Doe',
    yearsOld: 41,
    address: {
        street: 323,
        district: 'Brooklyn'
    }
}

welcomeMessage += user.username
console.log(welcomeMessage)

Primeiro criamos a função de resgatar os dados do nosso database, depois criamos uma váriavel que terá um complemento depois, criamos uma váriavel que armazena o resultado da requisição feita e complementados a váriavel welcomeMessage no final.

Todos os comandos são executados linha por linha, porém, a nossa função faz uma comunicação externa com o database e não sabemos o quanto tempo ela irá demorar para nos trazer a resposta, nesse caso ela é uma função assíncrona. Se você entendeu um pouco do que os termos significam, async await não será problema para você.

Declarando uma função assíncrona:

async function nameFunction(){} ou const nameFunction = async () => {}

// A palavra async já é auto-explicativa, estamos dizendo que nossa função será assíncrona.

const loadArticlesBlog = async () => {
    const req = await fetch('https://gabrielvalin-blog.herokuapp.com/articles')
    const response = await req.json()
    console.log(response)
}

loadArticlesBlog()

// A palavra await vai dizer para nossa aplicação que para ela executar qualquer instrução abaixo, ela deverá esperar o término da execução da instrução atual para passar o controle para a instrução seguinte.

Um exemplo que vai te fazer entender bem isso é quando você entra em um site e aquela tela de "loading" fica rodando na sua tela, isso quer dizer que o site está processando/buscando/acessando informações para montar a tela que vai ser visualizada.