2016-05-13 29 views
2
function ApiError(response) { 
    this.message = 'API error'; 
    this.response = response; 
} 

ApiError.prototype = Object.create(Error.prototype); 
ApiError.prototype.constructor = ApiError; 
ApiError.prototype.name = 'ApiError'; 

export default ApiError; 

Ich habe diese Ausnahme individuellen und ich werfe es an einem gewissen Punkt, aber wenn ich versuche es wieUmgang mit Ausnahme in Drossel

import ApiError from './ApiError'; 
... 
.catch(ApiError, (e) => { 
    console.log('api error'); 
}) 
.catch((e) => { 
    console.log(e); <= this is undefined(in ApiError) 
}); 

in Versprechen zu fangen die Fehler zu generic fängt mit Fehlern delegieren sage Diese Nachricht kann nicht undefiniert (this=undefined in ApiError) zugewiesen werden, was mache ich hier falsch?

EDIT: Das Problem war eigentlich die Tatsache, dass ich nicht eine Instanz von Drossel Versprechen zurückkehrt, aber Knoten Promise (mit fetch), habe ich beschlossen, es von innen Drossel Promise.resolve Einwickeln holen.

+0

Sie sollten besser [eine eigene Antwort] (http://stackoverflow.com/help/self-answer) anstatt die Lösung in die Frage zu bearbeiten. – Bergi

Antwort

0

Das Problem war eigentlich die Tatsache, dass ich nicht eine Instanz von Drossel Versprechen, aber ES6 Promise (mit Abruf) zurückkehrte , Habe ich es gelöst, indem ich fetch in Bluebird Promise.resolve eingebunden habe.

+0

Es scheint schwer zu sehen, wie dieses Problem an sich zu dem Fehler führt, den Sie in der Frage beschreiben. – jfriend00

+0

Es führt zu dem Fehler, nur weil die systemeigenen Versprechungen das Typprimieren des Fehlertyps als erstes Argument nicht unterstützen. Deshalb erhalte ich den Fehler, denn anstatt zu überprüfen, ob der Typ des Fehlers übereinstimmt, versucht das native Versprechen, das erste Argument aufzurufen, und es ruft den Konstruktor des Fehlers ohne 'new' auf, was dazu führt, dass' dieses' in diesem Fall nicht definiert ist . –

+0

OK, irgendwie schwer für uns, jemals eine Idee davon zu haben, da Sie nicht offengelegt haben, wo das fragliche Versprechen erstellt oder abgelehnt wird. Warum fügst du deiner Antwort nicht wenigstens diese zusätzliche Erklärung bei, sodass deine Antwort zumindest erklärt, warum du den Fehler bekommen hast, den du bekommen hast? – jfriend00

2

Dieser Fehler klingt, als ob Sie die Instanz Ihres ApiError Objekts nicht ordnungsgemäß erstellen.

Wenn Sie einen Ihrer Fehler werfen, sollte es sein:

throw new ApiError(xxx); 

Hinweis, die new, die verwendet werden müssen. Die Besonderheiten Ihres Fehlers machen es so, als ob Sie nicht die new verwenden.


Alternativ können Sie die Umsetzung Ihrer ApiError Konstruktor ändern, so dass Sie tun können;

throw ApiError(xxx); 

Aber würden Sie ApiError sich ändern müssen, um festzustellen, ob es mit new oder nicht, und wenn nicht, dann rufen genannt wurde, new selbst.

function ApiError(response) { 
    if (!(this instanceof ApiError)) { 
     return new ApiError(response); 
    } 
    this.message = 'API error'; 
    this.response = response; 
} 

Oder in ES6, können Sie die new.target Option:

function ApiError(response) { 
    if (!new.target) { 
     return new ApiError(response); 
    } 
    this.message = 'API error'; 
    this.response = response; 
} 
+0

Um nur ein wenig zu erläutern, könnte man erkennen, ob es mit 'new' mit' this instanceof ApiError' aufgerufen wurde, oder in es6 mit 'new.target' (zB' if (! New.target) return new ApiError (response) 'im Konstruktor) – redbmk

+1

@redbmk - Diese Optionen hinzugefügt. – jfriend00