2015-03-29 20 views
22

Próbuję przedłużyć obietnicyRozszerzanie Promises w ES6

class PersistedPromise extends Promise { } 

Następnie zadzwonić statycznej resolve na klasie pochodnej bezpośrednio stworzyć rozwiązane obietnicę:

PersistedPromise.resolve(1) 

W Traceur, Dało to:

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

w Babel (uruchom jako babel-node --experimental promise.js) skutkuje:

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

byłem w zależności od tego:

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(...)).

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

Wydaje się, że węzeł sprawdza this na połączeniach, takich jak Promise.resolve.call(this, val) do bycia Promise, zamiast (słusznie?) Promiselub jego (v0.12.0) klasy pochodnej.

Czy powyższe elementy nie działają lub nie zostały wprowadzone do specyfikacji lub po prostu nie zostały zaimplementowane przez traceur i/lub węzeł?

+0

To powinno zadziałać. Domyślam się, że żaden z transpilerów tego nie obsługuje. – Bergi

+4

** New Viewers Note ** - przykład kodu w tym pytaniu powinien się teraz skompilować i pracować w Babel. –

+2

@BenjaminGruenbaum Używam ustawienia Babel + ES2015 i nadal otrzymuję 'TypeError: # nie jest obietnicą' kiedy wywołuję konstruktora' new ExtendedPromise (res => {}) '. Czy jest jakaś inna sztuczka? – sighrobot

Odpowiedz

20

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

ES6 obiecuje w podklasie wsparcia spec. Oznacza to, że w końcu będziesz w stanie podklasy obiecać, że tak właśnie zrobiłeś. Jest to zgodne z projektem.

To powiedziawszy, żadna z przeglądarek nie śledzi tego poprawnie pod tym względem - o tyle, o ile wiem tylko o obietnicy ES6, Babel (core-js) i RSVP stosują semantykę ES6 pod względem prawidłowej podklasy. Obsługa przeglądarek w końcu nadchodzi, ale jeszcze jej nie ma. Trzymaj się.

Oto list of currently supporting implementations.