Failing fetch in einem Promise.all nicht Fangfehler

stimmen
1

Ich habe mehrere JSON Last und muß prüfen , ob alle von ihnen gut geholt werden. Also habe ich eine Promise.all verwenden für alle die warten fetch.

Der erste valid.jsonexistiert, nicht die zweiten, so dass das zweite fetchEnden mit einem 404. Aber trotz der Promise.reject, Promise.allimmer noch anmeldet , Success!anstatt die letzten Fehler zu werfen.

Gibt es etwas , was ich darüber , wie verpasst Promise.allfunktioniert?

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 ]

(Überprüft alle ähnlichen Fragen natürlich, aber nichts half 😕)


Bearbeiten - Fest Code nach unten Antworten:

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;
});
Veröffentlicht am 02/12/2019 um 23:57
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
2

Dieser Anruf:

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

... wird ein erfülltes Versprechen zurückzukehren, nicht zurückgewiesen ein. Jedes Mal, wenn Sie eine Ablehnung behandeln und Sie wollen es zu sprudeln als Ablehnung, sollten Sie explizit tun:

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

By the way, hat dies keine Auswirkung auf alle

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

... wie Sie tun nichts mit diesen neu geschaffenen, abgelehnt Versprechen.

Beantwortet am 03/12/2019 um 00:02
quelle vom benutzer

stimmen
1

Sie haben wieder Fehler zu werfen, wenn Sie den .catch () -Methode verwenden, oder der Fehler wird stumm geschaltet werden

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)
})

Beantwortet am 03/12/2019 um 00:05
quelle vom benutzer

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