web-dev-qa-db-fra.com

Promesse de rejet Erreur éventuellement non gérée:

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.

13
Juan

.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(...))
18
Esailija