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
});
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?
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.
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.