web-dev-qa-db-fra.com

Comment attraper une promesse.reject

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 .thens)

10
morbusg

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

26
ivo

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. 

2
Rahul

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