Bij gebreke halen in een Promise.all niet vangen fout

stemmen
1

Ik heb meerdere JSON te laden en moet controleren of alle van hen zijn goed gezocht. Dus ik een Promise.all gebruiken om te wachten op alle fetch.

De eerste valid.jsonbestaat, niet de tweede, zodat de tweede fetchuiteinden met een 404. Maar ondanks de Promise.reject, Promise.allnog steeds logt Success!in plaats van het gooien van de laatste fout.

Is er iets wat ik miste over hoe Promise.allwerkt?

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 ]

(Gecontroleerd alle soortgelijke vragen natuurlijk, maar niets hielp 😕)


bewerken - Vaste code na antwoorden hieronder:

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;
});
De vraag is gesteld op 02/12/2019 om 23:57
bron van user
In andere talen...                            


2 antwoorden

stemmen
2

Deze oproep:

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

... zal een vervuld belofte, niet verworpen één terugkeren. Wanneer u een afwijzing te behandelen en je wilt opborrelen als een afwijzing, moet u expliciet dat te doen:

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

By the way, heeft dit geen effect op alle

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

... als je niets doen met deze nieuw gecreëerde, afgewezen belofte.

antwoordde op 03/12/2019 om 00:02
bron van user

stemmen
1

moet je fout opnieuw te gooien wanneer u de methode .catch () te gebruiken, of de fout wordt gedempt

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

antwoordde op 03/12/2019 om 00:05
bron van user

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