2014-05-23 6 views
12

Ich habe eine Funktion, die einige Operationen mit einem Array. Ich möchte es ablehnen, wenn das Array leer ist.Versprechen ablehnen Möglicherweise nicht behandelt Fehler:

Als Beispiel

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

Wenn die Operation ablehnen geschieht ich die folgende Fehlermeldung erhalten. Möglicherweise nicht behandelt Fehler: Nicht gefunden

Allerdings habe ich den folgenden Haken, wenn der Aufruf von myArrayFunction() gemacht wird.

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

Was wäre der richtige Weg, um das Versprechen abzulehnen, die Ablehnung zu fangen und dem Kunden zu antworten?

Vielen Dank.

Antwort

18

.catch nimmt eine Funktion als Parameter, aber Sie übergeben es etwas anderes. Wenn Sie keine Funktion zum Abfangen übergeben, wird es im Hintergrund einfach nichts tun. Dumm, aber das verspricht ES6.

Da die .catch nichts tut, wird die Ablehnung nicht behandelt und Ihnen gemeldet.


Fix ist eine Funktion .catch weitergeben müssen:

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

Weil Sie einen Haken alle verwenden, ist der Fehler nicht unbedingt ein No-Array Fehler. Ich schlage vor, Sie tun dies statt:

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

Welche weiter verkürzt werden kann:

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

Beachten Sie auch den Unterschied zwischen:

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

Und

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

Die Lösung bestand darin, eine Funktion an .catch zu übergeben, wie Sie es vorgeschlagen haben. Die zweite Option, d. H. .Catch (NotFoundError, Antwort); gibt mir den folgenden Fehler "Ein Catch-Filter muss ein Fehler Konstruktor oder eine Filterfunktion sein" – juan

+0

@juan Sie NotFoundError implementieren – Esailija

+0

Ja, ich es wurde implementiert. – juan

Verwandte Themen