da2k / curso-reactjs-ninja

915 stars 322 forks source link

M2#A77 - Promisses #556

Closed alexandre1202 closed 3 years ago

alexandre1202 commented 3 years ago

Entendi que Promisse é uma operação a ser executada e terá sempre um resultado then() ou o encadeamento deles em caso de sucesso ou uma exception que será esse .catch() que devolverá um erro, mas por favor, pode compartilhar alguma explicação mais detalhada sobre Promisse se tiver algo além que você já deve ter explicado em alguma issue?

Por acaso existe alguma relação de premisse com requisição assíncrona?

Ou absolutamente tudo no JavaScript é assíncrono?

Por favor, o que é exatamente esse resolve()?

@fdaciuk

fdaciuk commented 3 years ago

Oi @Alexandre1202! Acho que esses artigos aqui da MDN podem te dar uma visão mais ampla sobre código assíncrono no geral em JavaScript: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous

Por acaso existe alguma relação de premisse com requisição assíncrona?

Tem relação porque Promise vai te permitir executar código de forma assíncrona no JS. Mas não necessariamente uma requisição assíncrona vai acontecer apenas com o uso de Promise. Promise é um tipo de dado na linguagem que te permite lidar com código assíncrono, mas existem outras formas de fazer isso: com temporizadores, por exemplo (setTimeout e setInterval) =)


Ou absolutamente tudo no JavaScript é assíncrono?

Na verdade, é o contrário. Praticamente tudo o que você faz no JS é síncrono. Código assíncrono tem seu valor quando colocamos o JS em um ambiente específico, como no da web, por exemplo, onde várias coisas precisam acontecer ao mesmo tempo, sem que a thread principal em que o JS está rodando fique bloqueada. Dá uma lida nos artigos que passei ali em cima, que deve dar uma clareada com relação a isso :D

Por favor, o que é exatamente esse resolve()?

O método resolve de Promise retorna uma Promise que será resolvida com aquele valor que foi passado via argumento. Sempre que você quiser "pegar" o resultado de uma Promise, é necessário usar o .then.

Pense em uma Promise como se fosse uma caixinha que contém um valor dentro. E a única forma de abrir essa caixinha é usando o método .then, e passando uma função para o .then.

Nessa função que você vai passar o .then, você terá acesso ao "conteúdo da caixinha", através do argumento da função.

Você pode pensar no método .then como se fosse similar ao método .map de array: pensando no array como uma caixinha com vários valores, ao usar o método .map, você passa uma função para esse método, que vai te dar, no argumento dessa função, cada um dos valores que está dentro da caixinha. Quando o .map termina de executar, ele cria uma nova caixinha com os valores que você retornou da função passada para o .map.

O .then de Promise segue a mesma ideia: sua promise é uma caixinha que contém um valor dentro. Para abrir a caixinha e conseguir pegar o valor de dentro, você usa o .then e passa uma função, e faz o que quiser com o valor, ali dentro do .then. No final o .then vai te retornar uma nova Promise, ou seja: ele cria uma nova "caixinha" (nova Promise) com o conteúdo do que você retornou dentro desse .then =)

Não é obrigatório retornar nada no .then, mas você pode fazer, assim como no .map, e ele vai te retornar uma nova caixinha (Promise) que poderá ser consumida novamente com outro .then, e assim por diante =)

Deu pra entender melhor? =)

alexandre1202 commented 3 years ago

O material do MDN é surpreendente ehinnn? Junto com sua explicação ficou claro e absorvi conceitos muito bem definidos. Mas vou ler mais e rever para ter claramente. O formato de uma expressão Lambda em conjunto com uma Thread do Java é bem parecido mas são bem diferentes.

Basicamente a Promise permite eu criar uma promessa de algo a ser executado assim que algo previamente necessário terminar. Para a promessa ser cumprida o bloco .then() executará conforme prometido e terei um resultado dentro do (resolve, reject) => {...codigo prometido...}

muito obrigado

pode fechar

fdaciuk commented 3 years ago

Boa! Qualquer coisa, só avisar :D