2017-10-09 8 views
0

Je fais des appels HTTP dans Node.js et je veux voir si la requête a échoué ou non - je veux dire par là qu'une erreur est pas nécessairement considérée comme une "condition d'échec", mais que je veux exécuter une logique métier basée sur cela. J'ai quelque chose de similaire au code suivant (bien évidemment, cela est arrangea puisque je simplifient):Comment puis-je résoudre une promesse au début de la chaîne?

let p = new Promise(function(resolve, reject) { 
    // In the real implementation this would make an HTTP request. 
    // The Promise resolution is either a response object or an Error passed to the `error` event. 
    // The error doesn't reject because the value I'm actually interested in getting is not the response, but whether the HTTP call succeeded or not. 
    Math.random() <= 0.5 ? resolve({ statusCode: 200 }) : resolve(new Error()); 
}); 

p.then(ret => { if (ret instanceof Error) return false; }) // This line should resolve the promise 
.then(/* Handle HTTP call success */); 

Fondamentalement, je veux dire: « si je résolus d'un objet d'erreur, juste en liberté sous caution et retourner false Sinon. affirmer un peu plus de choses sur l'objet de réponse et peut-être retourner true, peut-être retourner false. " Comment puis-je résoudre la promesse au début et ne pas exécuter le reste de la chaîne? Est-ce que je pense à tout cela? Je ne rejette pas la promesse si les erreurs d'appel HTTP car AFAICT vous ne pouvez pas obtenir une valeur de .catch() (cette promesse est finalement passée à Promise.all) de la même manière que vous pouvez avec .then(), mais je pourrais me tromper.

Je suis sur Bluebird, FWIW, alors n'hésitez pas à utiliser des trucs supplémentaires de leur part.

Répondre

0

Il suffit de ne pas utiliser une chaîne, mais un seul gestionnaire:

p.then(ret => { 
    if (ret instanceof Error) return false; // This line will resolve the promise 
    /* else handle HTTP call success, and return true/false or another promise for it */ 
}); 
1

Vous pouvez obtenir des valeurs d'un catch(), il suffit de les retourner, as stated on the docs:

En ne retournant une valeur rejetée ou à partir d'une capture, vous "récupérez de l'échec" et continuez la chaîne

Ce serait la meilleure solution entation;)