2016-03-31 6 views
18

ich benutzerdefinierte Fehler verwenden (es6-error) erlaubt mir Fehler wie so auf der Grundlage ihrer Klasse zu behandeln:Wie in einer switch-Anweisung verwenden Instanceof

import { DatabaseEntryNotFoundError, NotAllowedError } from 'customError'; 

function fooRoute(req, res) { 
    doSomethingAsync() 
    .then(() => { 
     // on resolve/success 
     return res.send(200); 
    }) 
    .catch((error) => { 
     // on reject/failure 
     if (error instanceof DatabaseEntryNotFoundError) { 
     return res.send(404); 
     } else if (error instanceof NotAllowedError) { 
     return res.send(400); 
     } 
     log('Failed to do something async with an unspecified error: ', error); 
     return res.send(500); 
    }; 
} 

Jetzt würde ich eher einen Schalter für diese Art von Strömungs verwenden in etwas, was wie:

import { DatabaseEntryNotFoundError, NotAllowedError } from 'customError'; 

function fooRoute(req, res) { 
    doSomethingAsync() 
    .then(() => { 
     // on resolve/success 
     return res.send(200); 
    }) 
    .catch((error) => { 
     // on reject/failure 
     switch (error instanceof) { 
     case NotAllowedError: 
      return res.send(400); 
     case DatabaseEntryNotFoundError: 
      return res.send(404); 
     default: 
      log('Failed to do something async with an unspecified error: ', error); 
      return res.send(500); 
     } 
    }); 
} 

instanceof nicht funktioniert jedoch ähnlich. Letzteres scheitert also.

Gibt es eine Möglichkeit, eine Instanz für ihre Klasse in einer switch-Anweisung zu überprüfen?

Antwort

28

Eine gute Möglichkeit ist die constructorproperty des Objekts zu verwenden:

// on reject/failure 
switch (error.constructor) { 
    case NotAllowedError: 
     return res.send(400); 
    case DatabaseEntryNotFoundError: 
     return res.send(404); 
    default: 
     log('Failed to do something async with an unspecified error: ', error); 
     return res.send(500); 
} 

Beachten Sie, dass die constructor genau mit dem überein muss das Objekt erstellt wurde (nehme error ist eine Instanz NotAllowedError und NotAllowedError a Unterklasse von Error):

  • error.constructor === NotAllowedError ist true
  • error.constructor === Error ist false

dies einen Unterschied von instanceof macht, die auch die Super-Klasse bieten kann:

  • error instanceof NotAllowedError ist true
  • error instanceof Error ist true

prüfen this interesting post über constructor Eigentum.

+0

Ich mag das mehr als meine eigene Antwort. Auf diese Weise muss ich nicht gegen Strings überprüfen, sondern kann gegen das eigentliche Objekt prüfen. Ich bin mir aber nicht sicher, was aus technischer Sicht sinnvoller wäre. – AlexTes

+0

Es ist einfacher, die Konstruktorfunktion als ihren Namen zu schreiben: die automatische Vervollständigung :). –