2015-03-29 13 views
22

Ich versuche, Versprechen zu verlängern:Erweiterung Promises in ES6

class PersistedPromise extends Promise { } 

Dann rufen Sie die statische resolve auf der abgeleiteten Klasse, um direkt ein aufgelöstes Versprechen zu erstellen:

PersistedPromise.resolve(1) 

In traceur, ergibt dies:

ModuleEvaluationError: #<PersistedPromise> is not a promise 
    at new PersistedPromise (~rtm/gen/promise.js:6:57) 
    at Function.resolve (native) 

in Babel (laufen als babel-node --experimental promise.js) führt dies zu:

Promise.apply(this, arguments); 
      ^
TypeError: [object Object] is not a promise 
    at new PersistedPromise (~rtm/gen/promise.js:1:23) 
    at Function.resolve (native) 
    ... 

Ich war abhängig davon:

All static methods of Promise support subclassing: they create new instances via their receiver (think: new this(...)) and also access other static methods via it (this.resolve(...) versus Promise.resolve(...)).

von http://www.2ality.com/2014/10/es6-promises-api.html.

Es scheint, dass die Knoten this auf Anrufe wie für eine Promise.resolve.call(this, val)Promise sein, anstatt (richtig?) Promiseoder einer abgeleiteten Klasse davon (v0.12.0) überprüft.

Ist das Obige nicht mehr funktionstüchtig, oder hat es nicht in die Spezifikation aufgenommen, oder einfach nicht von Traceur und/oder Knoten implementiert?

+0

Das sollte imo arbeiten. Meine Vermutung ist, dass keiner der Transpiler dies unterstützt. – Bergi

+4

** New Viewers Note ** - das Codebeispiel in dieser Frage sollte jetzt in Babel kompilieren und funktionieren. –

+2

@BenjaminGruenbaum Ich benutze Babel + ES2015 Preset und ich bekomme immer noch 'TypeError: # ist kein Versprechen, wenn ich den Konstruktor' new ExtendedPromise (res => {}) 'aufrufen. Gibt es einen anderen Trick? – sighrobot

Antwort

20

Is the above no longer operative, or did not make into the spec, or just not implemented by traceur and/or node?

ES6 verspricht in der Spezifikation Unterstützung Unterklassen. Das heißt, Sie werden schließlich in der Lage sein, Versprechungen genau so zu unterlassen, wie Sie es gerade getan haben. Das ist Absicht.

Das besagt, keiner der Browser folgt derzeit dieser Spezifikation korrekt in dieser Hinsicht - soweit ich weiß nur die ES6-Versprechen shim, Babel (Core-js) und RSVP folgen ES6 Semantik in Bezug auf Unterklassen richtig. Die Unterstützung in Browsern kommt schließlich, aber es ist noch nicht da. Festhalten.

Hier ist ein list of currently supporting implementations.