2016-06-16 2 views
1

Ich habe eine Versprechen-basierte Bibliothek (für Node.js 0.10 - 6.x) mit einer Methode, die mit einem Array zurückweist.Kombinieren Array mit Fehler in einem einzigen Typ

Bei Verwendung von Bluebird wird eine Warnung ausgegeben: a promise was rejected with a non-error.

Das Array in einen benutzerdefinierten Fehlertyp zu verpacken ist einfach, aber ich möchte vermeiden, dass die Abwärtskompatibilität der Bibliothek verletzt wird.

Ist es möglich, ein solches Objekt zu implementieren, das als ein Array verwendet werden könnte, während es von Bluebird gleichzeitig als Objekt Error gesehen wird?

Extras

Wenn aus Error ich folgende Helfer mit Node.js 0.10 für Kompatibilität verwenden vererben - 0,12:

function inherits(child, parent) { 
    child.prototype.__proto__ = parent.prototype; 
} 

und Blick auf die Bluebird Quelle, vielleicht ist es eine Möglichkeit, Umgehung der Überprüfung irgendwie:

Promise.prototype._rejectCallback = 
function(reason, synchronous, ignoreNonErrorWarnings) { 
    var trace = util.ensureErrorObject(reason); 
    var hasStack = trace === reason; 
    if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) { 
     var message = "a promise was rejected with a non-error: " + 
      util.classString(reason); 
     this._warn(message, true); 
    } 
    this._attachExtraTrace(trace, synchronous ? hasStack : false); 
    this._reject(reason); 
}; 

Antwort

-1

So lange ein s Ihre Umgebung ermöglicht Unterklasse Error, ja!

Ich fragte nach etwas Ähnliches während extending errors to create my own subtypes, was im Wesentlichen was Sie tun möchten. In der Tat habe ich etwas Ähnliches getan, um HTTP-spezifische Fehler zu erzeugen, die den Statuscode der Antwort enthalten.

Ihre Umgebung Unter der Annahme, class SubError extends Error erlaubt (und es ist eine Abhilfe, wenn nicht), tun Sie einfach:

class ErrorWithData { 
    constructor(msg, data = []) { 
    super(msg); // this changes with the workaround 
    this._data = [].concat(data); // make a copy for safety's sake 
    } 

    get data() { 
    return this._data; 
    } 
} 

Wenn Sie in einem älteren Browser sind, die nicht zulässt Error Unterklasse, können Sie Verwenden Sie die Shim-Klasse von @Mosho's answer und ersetzen Sie extends Error in diesem Beispiel durch extends ErrorClass.

NodeJS können Sie zu extends Errorfrom v4 und weiter, mit v6 having correct/full support dafür. Frühere Versionen erfordern Mosho's Workaround.

+0

Ich habe gerade meine Frage aktualisiert - es ist speziell für Node.js (0.10 - 6.x) –

+0

Einige dieser erlauben 'extends Error', einige nicht. Pro https://kangax.github.io/compat-table/es6/, v4 und v5 erfordern 'use strict' (falsch) und v6 erlaubt das Unterlassen von Fehlern im Allgemeinen, aber v0.10 und v0.12 nicht. – ssube

+0

Ich benutze bereits eine Unterlegscheibe für Sub-Classing unter Node.js 0.10 - 0.12, es funktioniert gut. Ich nehme an, dass es dort auch gemacht werden kann? :) 'Funktion erbt (untergeordnete, übergeordnete) { child.prototype .__ proto__ = parent.prototype; } ' –

0

Javascript erlaubt keine echte mehrfache prototypische Vererbung.

Sie können „erweitern“ Error aber die Unterklasse kann sowohl instanceof ein Error und ein Array nicht sein.

Wenn Bluebird Verwendung duck-typing können Sie versuchen, Array Objekt zu Unterklasse und Error Verhalten (Schnittstelle und und Eigenschaften) simulieren, aber dies hängt stark von Drossel-Fehler-Check-Implementierung.

Ich denke, es ist besser und robust, den Array-Wert in eine Fehlereigenschaft/Attribut zu umbrechen.

+0

'ist besser und robuster, um den Array-Wert in einen Fehler zu wickeln '- wie gesagt, der Hauptgrund, warum ich die Frage gestellt habe, besteht darin, die Abwärtskompatibilität zu vermeiden. –

+0

So können Sie versuchen, Array mit Fehler-Schnittstelle (wie Trace-Eigenschaft, etc.) Unterklasse. Betrachtet man die Bluebird-Quelle, wird kein 'instanceof Error' verwendet. Aber Sie können Probleme in der Zukunft haben, wenn sie es ändern. – Dario