In difetto prendere in una Promise.all errore non cattura

voti
1

Ho JSON multiplo per il carico e devono controllare se tutti sono ben inverosimile. Quindi io uso un Promise.all di aspettare per tutta la fetch.

Il primo valid.jsonesiste, non il secondo, quindi la seconda fetchestremità con un 404. Ma nonostante il Promise.reject, Promise.allregistra ancora Success!invece di gettare l'ultimo errore.

C'è qualcosa che mi mancava circa come Promise.allfunziona?

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 ]

(Controllato tutte le domande simili, naturalmente, ma non serviva a niente 😕)


modifica - Corretto codice dopo di seguito le risposte:

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;
});
È pubblicato 02/12/2019 alle 23:57
fonte dall'utente
In altre lingue...                            


2 risposte

voti
2

Questa chiamata:

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

... restituirà una promessa soddisfatte, non una respinta. Ogni volta che si tratti di un rifiuto e si vuole che bolla come un rifiuto, si dovrebbe esplicitamente farlo:

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

Tra l'altro, questo non ha alcun effetto a tutti

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

... come non fare nulla con questa nuova creazione, promessa respinto.

Risposto il 03/12/2019 a 00:02
fonte dall'utente

voti
1

si devono gettare di nuovo errore quando si utilizza il metodo .catch (), o l'errore verrà disattivato

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

Risposto il 03/12/2019 a 00:05
fonte dall'utente

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