Corriger les erreurs générées dans Promises dans Promises en JavaScript

Est-il possible que des erreurs apparaissent dans les promesses?

Voir le code ci-dessous pour référence, je voudrais obtenir promise1.catch pour attraper l’erreur générée dans promise2 (lequel courant ne fonctionne pas avec ce code):

 function test() { var promise1 = new Promise(function(resolve1) { var promise2 = new Promise(function(resolve2) { throw new Error('Error in promise2!'); }); promise2.catch(function(error2) { console.log('Caught at error2', error2); }); }); promise1.catch(function(error1) { console.log('Caught at error1', error1); }); } test(); 

Oui!!

La propagation des erreurs dans les promesses est l’un de ses meilleurs atouts. Il agit exactement comme dans le code synchrone.

 try { throw new Error("Hello"); } catch (e){ console.log('Caught here, when you catch an error it is handled'); } 

Est très similaire à:

 Promise.try(function(){ throw new Error("Hello"); }).catch(function(e){ console.log('Caught here, when you catch an error it is handled'); }); 

Tout comme dans le code séquentiel, si vous voulez appliquer une logique à l’erreur mais ne pas la marquer comme étant gérée, vous la relisez:

 try { throw new Error("Hello"); } catch (e){ console.log('Caught here, when you catch an error it is handled'); throw e; // mark the code as in exceptional state } 

Ce qui devient:

 var p = Promise.try(function(){ throw new Error("Hello"); }).catch(function(e){ console.log('Caught here, when you catch an error it is handled'); throw e; // mark the promise as still rejected, after handling it. }); p.catch(function(e){ // handle the exception }); 

Notez que dans Bluebird, vous pouvez avoir saisi et capturé des captures conditionnelles. Par conséquent, si vous vous contentez de spécifier le type ou le contenu de la promesse pour décider de la traiter ou non, vous pouvez l’enregistrer.

 var p = Promise.try(function(){ throw new IOError("Hello"); }).catch(IOError, function(e){ console.log('Only handle IOError, do not handle syntax errors'); }); 

Vous pouvez également utiliser .error pour gérer OperationalError qui proviennent d’API promisifiées. En général, OperationalError signifie une erreur à laquelle vous pouvez remédier (par opposition à une erreur du programmeur). Par exemple:

 var p = Promise.try(function(){ throw new Promise.OperationalError("Lol"); }).error(function(e){ console.log('Only handle operational errors'); }); 

Cela présente l’avantage de ne pas réduire TypeError silence les erreurs de type et les erreurs de syntaxe de TypeError dans votre code, ce qui peut être gênant en JavaScript.