A défaut chercher une erreur Promise.all ne pas attraper

voix
1

J'ai plusieurs JSON à la charge et doit vérifier si tous sont bien tiré par les cheveux. Donc , j'utilise un Promise.all attendre tous les fetch.

La première valid.jsonexiste, et non pas la seconde, de sorte que les secondes fetchextrémités avec un 404. Mais en dépit de la Promise.reject, Promise.alllogue toujours au Success!lieu de jeter la dernière erreur.

Est - il je quelque chose manqué sur la façon dont Promise.allfonctionne?

const json_pathes = [
    'valid.json',
    'not_valid.json'
];

function check_errors(response) {
    if (!response.ok) {
        Promise.reject('Error while fetching data');
        throw Error(response.statusText + ' (' + response.url + ')');
    }
    return response;
}

Promise.all(json_pathes.map(url =>
    fetch(url)
        .then(check_errors)
        .then(response => response.json())
        .catch(error => console.log(error))
))
.then(data => {
    console.log('Success!', data);
})
.catch(reason => {
    throw Error(reason);
});

// Console:
// Error: Not Found (not_valid.json)
// uncaught exception: Error while fetching data
// Array [ […], undefined ]

(Vérifié toutes les questions similaires bien sûr, mais rien aidé 😕)


modifier - le code fixe après ci-dessous les réponses:

const json_pathes = […]
Promise.all(json_pathes.map(url =>
    fetch(url)
        .then(response => {
            if (!response.ok)
                throw Error(response.statusText + ' (' + response.url + ')');
            return response;
        })
        .then(response => response.json())
        .catch(error => {
            throw error;
        })
))
.then(data => {
    // Success
})
.catch(error => {
    throw error;
});
Créé 02/12/2019 à 23:57
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Cet appel:

 .catch(error => console.log(error))

... retournera une promesse remplie, pas un rejet. Chaque fois que vous traitez un rejet et que vous voulez faire des bulles comme un rejet, vous devez explicitement faire:

 .catch(error => {
       console.log(error);
       throw error; // cascade...
 })

D'ailleurs, cela n'a aucun effet

 Promise.reject('Error while fetching data');

... que vous ne faites rien avec ce nouveau, promesse rejetée.

Créé 03/12/2019 à 00:02
source utilisateur

voix
1

vous devez jeter à nouveau lorsque vous utilisez la méthode .catch (), ou l'erreur est coupé

Promise.all(
  json_paths.map(url => 
    fetch(url)
      .then(response => response.json())
      .catch(err => {
        console.log(err);
        throw err
      })
  )
).then(data => {
  // all promise resolved
  console.log(data)
}).catch(err => {
  // some promise may not be resolved
  console.log(err)
})

Créé 03/12/2019 à 00:05
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more