web-dev-qa-db-fra.com

axios.all se propage et attrape tout

J'utilise la méthode .all de la bibliothèque populaire "axios" pour le traitement de mes demandes ajax.

Mais comment puis-je gérer les erreurs au cas où toutes les demandes recevraient 404?

par exemple:

axios.all([
        axios.get('http://some_url'),
        axios.get('http://another_url'),
      ])
        .then(axios.spread((someUrl, anotherUrl) => {
         // ... boring stuff goes there
        }))
        .catch(() => {
         //... error goes there
        });

 enter image description here

Ainsi, il semble qu'une seule erreur a été "attrapée".

Comment puis-je les attraper tous? Ou peut-être y at-il un peu .finalement?

5
WebArtisan

Le problème (comme vous le savez déjà) est que vous allez entrer dans le bloc catch dès que la première promesse est rejetée, ce qui rend impossible la collecte de toutes les réponses ayant échoué dans la même catch. Cependant, vous pouvez toujours gérer manuellement les promesses échouées pour regrouper les erreurs et les renvoyer ensuite. 

Vérifiez que cela fonctionnera pour vous:

const promises = [
  axios.get('http://some_url'),
  axios.get('http://another_url'),
]
const promisesResolved = promises.map(promise => promise.catch(error => ({ error })))

function checkFailed (then) {
  return function (responses) {
    const someFailed = responses.some(response => response.error)

    if (someFailed) {
      throw responses
    }

    return then(responses)
  }
}

axios.all(promisesResolved)
  .then(checkFailed(([someUrl, anotherUrl]) => {
    console.log('SUCCESS', someUrl, anotherUrl)
  }))
  .catch((err) => {
    console.log('FAIL', err)
  });

Vous entrerez dans le bloc catch si au moins une des promesses échoue. Vous pouvez en trouver un en vérifiant le tableau err de réponses.

5
dfsq

Je ne pense pas que cela soit possible en raison du comportement rapide de Promise.all. Si l'une de vos demandes échoue, elle sera automatiquement la cause et le résultat sera pris.

    Promise.all([
      Promise.reject(Error('1')),
      Promise.reject(Error('2')),
      Promise.reject(Error('3'))
    ]).then((results) => {
      console.log(results)
    }, (error) => {
      console.log(error.message)
    })

Ce code résultant sera toujours imprimé 1 car c'est le premier à échouer. Je pense qu'une fonctionnalité similaire a été demandée sur le référentiel et ils ont dit que ce n'était pas possible.

J'allais laisser cela comme un commentaire mais je n'ai pas encore une réputation assez élevée.

1
Charlie