Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

156
Visualizações
only throw error if all API calls in Promise.all fail

Before starting an express server JS I want to make three API calls. If any one of them fails I just want to log an error, but if all three fail I want to throw an error and prevent the server from starting.

I have seen I can use Promise.all, but I am unsure how to handle the case if one fails. Using the code below if any fail the error will be thrown. How can I limit this to only occurring if all calls fail?

const fetchNames = async () => {
    try {
      await Promise.all([
        axios.get("./one.json"),
        axios.get("./two.json"),
        axios.get("./three.json")
      ]);
    } catch {
      throw Error("Promise failed");
    }
  };
about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

If you don't need the fulfillment values, or need just any of them, Promise.any will work for this use case - it'll reject only if all Promises reject.

const firstResolveValue = await Promise.any([
        axios.get("./one.json"),
        axios.get("./two.json"),
        axios.get("./three.json")
]);

If you need all result values from the Promises that happen to fulfill, use Promise.allSettled.

const settledResults = await Promise.allSettled([
    axios.get("./one.json"),
    axios.get("./two.json"),
    axios.get("./three.json")
]);
const fulfilledResults = settledResults.filter(result => result.status === 'fulfilled');
if (!fulfilledResults.length) {
    throw new Error();
} else {
    // do stuff with fulfilledResults
}
about 4 years ago · Juan Pablo Isaza Relatório

0

If you need just any of the results, Promise.any will work for this use case - it'll reject only if all promises reject.

const value = await Promise.any([
    axios.get("./one.json").catch(err => { console.log(err); throw err; }),
    axios.get("./two.json").catch(err => { console.log(err); throw err; }),
    axios.get("./three.json").catch(err => { console.log(err); throw err; }),
]);

If you need all result values from the promises that did happen to fulfill, use Promise.allSettled.

const results = await Promise.allSettled([
    axios.get("./one.json"),
    axios.get("./two.json"),
    axios.get("./three.json"),
]);
const values = [], errors = [];
for (const result of results) {
    if (result.status === 'fulfilled') {
        values.push(result.value);
    } else { // result.status === 'rejected'
        errors.push(result.reason);
    }
}
if (!values.length) {
    throw new AggregateError(errors);
} else {
    for (const err of errors) {
        console.log(err);
    }
    // do stuff with values
}
about 4 years ago · Juan Pablo Isaza Relatório

0

If I understand correctly, you're actually interested in not having the catch(e){...} executed if any of them worked, right? then you can do this:

const fetchNames = async () => {
    try {
      await Promise.all([
        axios.get("./one.json").catch(e => console.log(`one failed`, e)),
        axios.get("./two.json").catch(e => console.log(`two failed`, e)),
        axios.get("./three.json").catch(e => console.log(`three failed`, e))
      ]);
    } catch {
      throw Error("Promise failed");
    }
  };

The problem above is that if all of them fail, then no error is thrown. If you're also interested in that, then something like this should work:

const fetchNames = async () => {
    try {
      let success = false;
      await Promise.all([
        axios.get("./one.json").then( () => success = true).catch(e => console.log(`one failed`, e)),
        axios.get("./two.json").then( () => success = true).catch(e => console.log(`two failed`, e)),
        axios.get("./three.json").then( () => success = true).catch(e => console.log(`three failed`, e))
      ]);
    if (!success) throw new Error(`No successful promises`);
    } catch {
      throw Error("Promise failed");
    }
  };
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda