Promises

Promises

Médio

Introdução

Antes de a classe Promise ser introduzida, havia apenas uma forma de lidar com código assíncrono: o padrão de callback.

Um callback é uma função que é passada como argumento para outra função e será chamado assim que alguma ação nessa outra função terminar. Um padrão comum para essas funções de callback é que elas recebem um "error" como primeiro parâmetro (veja o exemplo abaixo).

function callback(error, arg2, arg3) {}

E como isso se relaciona com código assíncrono?

Historicamente, os callbacks têm sido usados para nos permitir fazer algum trabalho depois que uma tarefa assíncrona terminou e sem bloquear o programa inteiro.

fetchProduct(productId, function (error, data) {
  if (error) {
    // Handle the error
  } else {
    // Do some work
  }
});

No exemplo acima, a função fetchProduct (que é assíncrona) recebe um callback como segundo argumento, que decide o que fazer quando os dados do produto tiverem sido recuperados.

Instruções

Os dois objetivos deste exercício são:

  1. Implemente uma função promisify que transforma uma função que usa o padrão de callback em uma função que retorna uma Promise. Veja o exemplo abaixo.
function fetchProduct(productId, function(error, data) {
    if (error) {
        // Handle the error
    } else {
        // Make something with your data
    }
})

const fetchProductAsPromise = promisify(fetchProduct);

// Now you got a function `fetchProductAsPromise`
// that returns a promise
fetchProductAsPromise(productId)
    .then((data) => {})
    .catch((error) => {});
  1. Reimplemente os seguintes métodos nativos de Promise (sem usá-los)
  • all: recebe um array de promises e é resolvido quando todas elas são resolvidas, ou é rejeitado quando uma delas é rejeitada.
  • allSettled: recebe um array de promises e é resolvido quando todas elas são resolvidas ou rejeitadas.
  • race: recebe um array de promises e é resolvido ou rejeitado com o valor da primeira promise que for resolvida ou rejeitada.
  • any: recebe um array de promises e é resolvido quando uma delas for resolvida, ou é rejeitado quando todas elas forem rejeitadas.
Editar via GitHub O link abre em uma nova janela ou aba
JavaScript Exercism

Tudo pronto para começar Promises?

Crie sua conta no Exercism para aprender e dominar JavaScript com 37 conceitos159 exercícios e mentoria humana de verdade, tudo de graça.