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
- Compreensão dos Objetos Deferred
- Encadeamento e Composição de Promises
- Tratamento de Várias Tarefas Assíncronas