O que são promises e como funciona o encadeamento de promises?

Uma Promise é um objeto que representa a eventual conclusão ou falha de uma operação assíncrona. Está inicialmente em um estado pendente. Ele pode então transitar para um estado fulfilled quando a operação for bem-sucedida ou um estado rejected quando a operação falhar. Aqui está um exemplo de criação de uma Promise:
const aPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("Operation successful!");
  }, 1000);
});
Neste exemplo, criamos uma promise que simula uma operação assíncrona usando setTimeout. Após um segundo, a promise é resolvida com a mensagem Operation successful!. Outra forma de trabalhar com promises é usar os métodos .then e .catch. O método .then() é usado em uma promise para especificar o que deve acontecer quando a promise é cumprida, enquanto .catch() é usado para tratar quaisquer erros que ocorram. Vamos ver como podemos usar .then e .catch com nossa promise:
aPromise.then((result) => {
  console.log(result);  // Outputs: "Operation successful!"
}).catch((error) => {
  console.error(error);
});
Neste código, a função passada para .then() será chamada com o valor resolvido da promise. Se ocorrer um erro, a função passada para .catch() será chamada em vez disso. Agora, vamos falar sobre encadeamento de promises. Uma das funcionalidades poderosas das promises é que podemos encadear múltiplas operações assíncronas juntas. Each .then() can return a new promise, allowing you to perform a sequence of asynchronous operations one after the other. Here’s an example:
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => {
    console.log(data);
    return fetch('https://api.example.com/data2');
  })
  .then(response => response.json())
  .then(data2 => console.log(data2))
  .catch(error => console.error('Error:', error));
Neste exemplo, estamos fazendo duas chamadas de API em sequência. O primeiro .then() analisa a resposta como JSON. O segundo .then() registra os dados e faz outra chamada de API. O terceiro .then() analisa a resposta da segunda chamada da API e o quarto .then() registra esses dados. Se ocorrer um erro em qualquer ponto dessa cadeia, ele será capturado pelo .catch() no final. É importante notar que .catch() irá capturar erros de qualquer uma das etapas anteriores na cadeia. Isso significa que você não precisa adicionar tratamento de erros a cada etapa individual, o que pode simplificar muito o seu código.
Este módulo não possui perguntas. Marque como concluído.