0Pricing
jQuery Academy · Aula

Encadeamento e Composição de Promises

Aprenda a encadear várias operações assíncronas usando .then() e .pipe() e a compor fluxos de trabalho complexos aguardando a conclusão de várias Promises com $.when().

Encadeamento e Composição de Promises é uma aula grátis de jQuery Academy no CoddyKit. Esta é a aula 2 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de jQuery Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de jQuery Academy inclui 3 aulas no total.

Sequenciar operações assíncronas

Em desenvolvimento web, frequentemente precisamos executar tarefas assíncronas (como buscar dados) em uma ordem específica. O encadeamento de promessas permite fazer isso de forma organizada.

Em vez de aninhar retornos de chamada, o que pode levar ao "inferno de retornos de chamada", podemos vincular as operações sequencialmente, tornando nosso código muito mais fácil de ler e manter.

Encadeamento com .then()

O método .then() é fundamental para o encadeamento. Quando um Deferred (ou Promise) é resolvido, seu retorno de chamada .then() é executado. O que esse retorno de chamada retorna pode então ser usado pelo .then() seguinte no encadeamento.

Se o retorno de chamada retornar um novo Deferred, o encadeamento aguardará a resolução desse novo Deferred antes de prosseguir.

Exemplo simples de encadeamento com .then()

Vamos ver um exemplo simples em que simulamos duas etapas assíncronas. A segunda etapa é executada somente depois que a primeira é concluída e usa os dados da primeira etapa.

Observe como o resultado de step1 ('Data from Step 1') é passado para step2.

function runChainExample() {
  let dfd1 = new $.Deferred();
  let dfd2 = new $.Deferred();

  setTimeout(() => {
    console.log("Step 1 complete!");
    dfd1.resolve("Data from Step 1");
  }, 500);

  dfd1.then(function(data1) {
    console.log("Received in Step 2: " + data1);
    setTimeout(() => {
      console.log("Step 2 complete!");
      dfd2.resolve("Processed " + data1);
    }, 300);
    return dfd2;
  }).then(function(data2) {
    console.log("Received in Final Step: " + data2);
    console.log("Chain finished!");
  });
}

$(document).ready(function() {
  runChainExample();
});

Fluxo de dados em encadeamentos .then()

O valor retornado por um retorno de chamada .then() determina a entrada do próximo .then().

  • Se você retornar um valor que não seja Deferred, esse valor se tornará o valor resolvido do próximo .then().
  • Se você retornar um objeto Deferred, o encadeamento será pausado até que esse Deferred seja resolvido; em seguida, seu valor resolvido será passado ao próximo .then().

Usando .pipe() para transformação

Embora .then() seja o padrão moderno, o .Deferred() do jQuery também oferece .pipe(). Ele é semelhante a .then(), mas foi originalmente projetado para transformar o valor resolvido ou rejeitado, ou para filtrar qual Deferred continua o encadeamento.

.pipe() pode ser usado para retornar um novo Deferred que é resolvido com um valor transformado, efetivamente "canalizando-o" para a próxima etapa.

Exemplo de transformação com .pipe()

Aqui, usamos .pipe() para obter o resultado da primeira operação, transformá-lo (por exemplo, convertê-lo para letras maiúsculas) e então passar o valor transformado ao manipulador .done() final.

function runPipeExample() {
  let dfd = new $.Deferred();

  setTimeout(() => {
    console.log("Initial data ready.");
    dfd.resolve("hello world");
  }, 500);

  dfd.pipe(function(originalData) {
    console.log("Piping: Transforming data...");
    return originalData.toUpperCase(); // Transforms the value
  }).done(function(transformedData) {
    console.log("Final result: " + transformedData);
  });
}

$(document).ready(function() {
  runPipeExample();
});

Compondo com $.when()

E se você tiver várias tarefas assíncronas independentes, mas precisar aguardar a conclusão de todas elas antes de prosseguir? É aí que $.when() entra em ação.

$.when() recebe um ou mais objetos Deferred (ou Promises) como argumentos e retorna um novo Deferred. Esse novo Deferred só é resolvido quando todos os Deferreds de entrada tiverem sido resolvidos.

Exemplo de tarefas paralelas com $.when()

Neste exemplo, simulamos duas solicitações AJAX independentes (fetchUser e fetchPosts). Usamos $.when() para aguardar a conclusão de ambas antes de registrar os resultados combinados.

Observe que elas são executadas em paralelo, não sequencialmente.

function runWhenExample() {
  function fetchUser() {
    let dfd = new $.Deferred();
    setTimeout(() => {
      console.log("User data fetched.");
      dfd.resolve({ id: 1, name: "Alice" });
    }, 800);
    return dfd.promise();
  }

  function fetchPosts() {
    let dfd = new $.Deferred();
    setTimeout(() => {
      console.log("Posts data fetched.");
      dfd.resolve([{ id: 101, title: "Post 1" }, { id: 102, title: "Post 2" }]);
    }, 500);
    return dfd.promise();
  }

  $.when(fetchUser(), fetchPosts())
    .done(function(userData, postsData) {
      console.log("All data loaded!");
      console.log("User: ", userData);
      console.log("Posts: ", postsData);
    })
    .fail(function() {
      console.log("One or more tasks failed.");
    });
}

$(document).ready(function() {
  runWhenExample();
});

Acessando os resultados de $.when()

Quando o Deferred retornado por $.when() é resolvido, seus retornos de chamada .done() ou .then() recebem os valores resolvidos de cada Deferred de entrada como argumentos separados, na ordem em que foram passados para $.when().

Isso facilita combinar e processar dados de várias fontes assim que todos estiverem disponíveis.

Questionário sobre encadeamento de promessas

Considere o seguinte trecho de código jQuery:

let dfd1 = new $.Deferred();
let dfd2 = new $.Deferred();

dfd1.then(function(val) {
  return val + " World";
}).then(function(newVal) {
  console.log(newVal); // Line A
  return dfd2;
}).then(function() {
  console.log("Finished!"); // Line B
});

dfd1.resolve("Hello");
dfd2.resolve();

Qual é a saída FINAL exibida no console e em que ordem?

Recapitulação: encadeamento e composição

Aprendemos a gerenciar fluxos de trabalho assíncronos complexos:

  • Encadeamento com .then(): sequencia as operações, passando os resultados de uma etapa para a seguinte.
  • .pipe(): um método mais antigo para transformar valores ou mapear Deferreds em um encadeamento.
  • Composição com $.when(): aguarda a conclusão, em paralelo, de vários Deferreds independentes antes de prosseguir, fornecendo seus resultados como argumentos separados.

Esses padrões são essenciais para criar aplicações assíncronas robustas e fáceis de ler.

Perguntas Frequentes

A aula “Encadeamento e Composição de Promises” é grátis?

Sim — o texto completo de “Encadeamento e Composição de Promises” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de jQuery Academy, atualize para CoddyKit PRO. O curso de jQuery Academy inclui 3 aulas no total.

O que vou aprender em “Encadeamento e Composição de Promises”?

Aprenda a encadear várias operações assíncronas usando .then() e .pipe() e a compor fluxos de trabalho complexos aguardando a conclusão de várias Promises com $.when(). Você pratica jQuery Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar jQuery Academy?

Nenhuma experiência prévia é necessária. jQuery Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 3.

Quanto tempo leva a aula “Encadeamento e Composição de Promises”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de jQuery Academy?

Sim. Cada aula de jQuery Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Compreensão dos Objetos Deferred
  2. Encadeamento e Composição de Promises
  3. Tratamento de Várias Tarefas Assíncronas
← Voltar para jQuery Academy