J'ai une fonction qui effectue certaines opérations à l'aide d'un tableau. Je voudrais le rejeter lorsque le tableau est vide.
Par exemple
myArrayFunction(){
return new Promise(function (resolve, reject) {
var a = new Array();
//some operation with a
if(a.length > 0){
resolve(a);
}else{
reject('Not found');
}
};
}
Lorsque l'opération de rejet se produit, j'obtiens l'erreur suivante. Erreur éventuellement non gérée: introuvable
Cependant, j'ai le problème suivant lorsque l'appel à myArrayFunction () est effectué.
handlers.getArray = function (request, reply) {
myArrayFunction().then(
function (a) {
reply(a);
}).catch(reply(hapi.error.notFound('No array')));
};
Quelle serait la bonne façon de rejeter la promesse, de saisir le rejet et de répondre au client?
Je vous remercie.
.catch
prend une fonction comme paramètre cependant, vous lui passez quelque chose d'autre. Lorsque vous ne passez pas une fonction à intercepter, elle échouera silencieusement. Stupide mais c'est ce que promettent ES6.
Parce que le .catch
ne fait rien, le rejet devient non géré et vous est signalé.
Le correctif consiste à passer une fonction à .catch
:
handlers.getArray = function (request, reply) {
myArrayFunction().then(function (a) {
reply(a);
}).catch(function(e) {
reply(hapi.error.notFound('No array')));
});
};
Parce que vous utilisez un catch all, l'erreur n'est pas nécessairement une erreur No array. Je vous suggère de faire ceci à la place:
function myArrayFunction() {
// new Promise anti-pattern here but the answer is too long already...
return new Promise(function (resolve, reject) {
var a = new Array();
//some operation with a
if (a.length > 0) {
resolve(a);
} else {
reject(hapi.error.notFound('No array'));
}
};
}
}
function NotFoundError(e) {
return e.statusCode === 404;
}
handlers.getArray = function (request, reply) {
myArrayFunction().then(function (a) {
reply(a);
}).catch(NotFoundError, function(e) {
reply(e);
});
};
Qui peut être encore raccourci en:
handlers.getArray = function (request, reply) {
myArrayFunction().then(reply).catch(NotFoundError, reply);
};
Notez également la différence entre:
// Calls the method catch, with the function reply as an argument
.catch(reply)
Et
// Calls the function reply, then passes the result of calling reply
// to the method .catch, NOT what you wanted.
.catch(reply(...))