J'ai une fonction d'aide pour utiliser fetch
avec CouchDB qui se termine par:
...
return fetch(...)
.then(resp => resp.ok ? resp.json() : Promise.reject(resp))
.then(json => json.error ? Promise.reject(json) : json)
et quand je l'utilise ailleurs, j'avais l'impression de pouvoir .catch
ces rejets explicites:
above_function(its_options)
.then(do_something)
.catch(err => do_something_with_the_json_error_rejection_or_resp_not_ok_rejection_or_the_above(err))
mais hélas, il semble que je n'arrive pas à mettre la main sur les rejets ... L'erreur spécifique que je cherche est une réponse HTTP 401.
Ce qui donne?
(Veuillez noter qu'il y a ES6 return
implicites dans le .then
s)
function test() {
return new Promise((resolve, reject) => {
return reject('rejected')
})
}
test().then(function() {
//here when you resolve
})
.catch(function(rej) {
//here when you reject the promise
console.log(rej);
});
Assurez-vous que chaque appel à une then()
renvoie une valeur.
Par exemple.
var url = 'https://www.google.co.in';
var options = {};
var resolves = Promise.resolve();
resolves.then(() => {
console.log('Resolved first promise');
var fetchPromise = fetch(url, options);
fetchPromise.then(() => {
console.log('Completed fetch');
});
})
.catch(error => {
console.log('Error', error);
});
Notez que console
indique une exception non interceptée. Cependant, si vous avez retourné la promesse interne (ou toute autre valeur, qui finit par se transformer en une promesse via resolve
), vous finissez par aplatir la promesse, de sorte que l'exception se propage.
var url = 'https://www.google.co.in';
var options = {};
var resolves = Promise.resolve();
resolves.then(() => {
console.log('Resolved first promise');
var fetchPromise = fetch(url, options);
return fetchPromise.then(() => {
console.log('Completed fetch');
});
})
.catch(error => {
console.log('Error', error);
});
Remarquez les bulles d’exception jusqu’à la promesse extérieure. J'espère que cela clarifie un peu les choses.
Les rejets de promesses tombent dans le deuxième paramètre de la fonction then
.
function test() {
return new Promise((resolve, reject) => {
return reject('rejected')
})
}
test().then(function() {
//here when you resolve
}, function(rej) {
//here when you reject the promise
console.log(rej)
})