2015-03-29 4 views
22

Я пытаюсь продлить обещание:Продление Promises в ES6

class PersistedPromise extends Promise { } 

Затем вызовите статический resolve на производный класс непосредственно создать разрешенное обещание:

PersistedPromise.resolve(1) 

В трейсер, это дает:

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

в Вавилонской (запуск, как babel-node --experimental promise.js) это приводит к:

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

Я был в зависимости от этого:

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

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

Похоже, что узел проверяет this на вызовы, такие как Promise.resolve.call(this, val) за то, что Promise, а не (правильно?) Promiseили производного класса его (v0.12.0).

Является ли вышеизложенное более недействующим или не входит в спецификацию или просто не реализовано трассировщиком и/или узлом?

+0

Это должно работать imo. Я предполагаю, что ни один из transpilers не поддерживает это. – Bergi

+4

** New Viewers Note ** - пример кода в этом вопросе теперь должен компилироваться и работать в Babel. –

+2

@BenjaminGruenbaum Я использую предустановку Babel + ES2015, и я все еще получаю 'TypeError: # не является обещанием', когда я вызываю конструктор 'new ExtendedPromise (res => {})'. Есть ли еще трюк? – sighrobot

ответ

20

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

ES6 обещает в подклассе поддержки спецификации. То есть, вы в конечном итоге сможете подклассы обещать, как вы это делали. Это по дизайну.

Тем не менее, ни один из браузеров в настоящее время не соответствует этой спецификации в этом отношении - насколько я знаю только шасси ES6-обещания, Babel (core-js) и RSVP следуют семантике ES6 относительно правильной подклассы. Поддержка в браузерах в конечном итоге приходит, но ее пока нет. Держитесь крепко.

Адрес list of currently supporting implementations.

Смежные вопросы