2014-05-23 12 views
12

Ho una funzione che esegue un'operazione utilizzando un array. Mi piacerebbe rifiutarlo quando l'array è vuoto.Promessa di rifiuto Possibile non gestita Errore:

Come esempio

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

Quando l'operazione di scarto accade ottengo il seguente errore. Eventualmente non gestito Errore: non trovato

Tuttavia, ho il seguente problema quando viene effettuata la chiamata a myArrayFunction().

handlers.getArray = function (request, reply) { 
    myArrayFunction().then(
     function (a) { 
      reply(a); 
     }).catch(reply(hapi.error.notFound('No array'))); 
}; 

Quale sarebbe il modo corretto di rifiutare la promessa, prendere il rifiuto e rispondere al cliente?

Grazie.

risposta

18

.catch prende una funzione come parametro, tuttavia, si sta passando ad altro. Quando non si passa una funzione da catturare, silenziosamente non riuscirà a fare nulla. Stupido ma è quello che promette ES6.

Poiché il .catch non sta facendo nulla, il rifiuto diventa non gestito e viene segnalato a voi.


Fix è quello di passare una funzione per .catch:

handlers.getArray = function (request, reply) { 
    myArrayFunction().then(function (a) { 
     reply(a); 
    }).catch(function(e) { 
     reply(hapi.error.notFound('No array'))); 
    }); 
}; 

Poiché si utilizza tutta una cattura, l'errore non è necessariamente un errore Nessun array. Vi suggerisco di fare questo, invece:

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

che può essere ulteriormente ridotto a:

handlers.getArray = function (request, reply) { 
    myArrayFunction().then(reply).catch(NotFoundError, reply); 
}; 

Si noti inoltre la differenza tra:

// Calls the method catch, with the function reply as an argument 
.catch(reply) 

E

// Calls the function reply, then passes the result of calling reply 
// to the method .catch, NOT what you wanted. 
.catch(reply(...)) 
+0

La correzione era passare una funzione a .catch come suggerito. La seconda opzione i.e. .catch (NotFoundError, reply); mi dà il seguente errore "Un filtro catch deve essere un costruttore di errori o una funzione filtro" – juan

+0

@juan hai implementato NotFoundError – Esailija

+0

Sì, è stato implementato. – juan

Problemi correlati