Расширение промисов в ES6

Я пытаюсь расширить Promise:

class PersistedPromise extends Promise { }

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

PersistedPromise.resolve(1)

В traceur это дает:

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

В Babel (запускается как 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)
    ...

Я зависел от этого:

Все статические методы Promise поддерживают подклассы: они создают новые экземпляры через своего получателя (подумайте: new this(...)) и также получают через него доступ к другим статическим методам (this.resolve(...) по сравнению с Promise.resolve(.. .)).

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

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

Вышеупомянутое больше не работает, или не попало в спецификацию, или просто не реализовано traceur и/или узлом?


person Community    schedule 29.03.2015    source источник
comment
Это должно работать имхо. Я предполагаю, что ни один из транспиляторов не поддерживает это.   -  person Bergi    schedule 30.03.2015
comment
Примечание для новых зрителей: пример кода в этом вопросе теперь должен компилироваться и работать в Babel.   -  person Benjamin Gruenbaum    schedule 18.04.2015
comment
@BenjaminGruenbaum Я использую предустановку Babel + ES2015, и я все еще получаю TypeError: #<ExtendedPromise> is not a promise, когда вызываю конструктор new ExtendedPromise(res => {}). Есть ли какой-нибудь другой трюк для этого?   -  person sighrobot    schedule 02.03.2016
comment
@sighrobot, вероятно, потому, что вы не используете полифилл и/или используете браузер, который предлагает собственные промисы.   -  person Benjamin Gruenbaum    schedule 02.03.2016
comment
@BenjaminGruenbaum Спасибо!   -  person sighrobot    schedule 02.03.2016
comment
@BenjaminGruenbaum Полифил необходим, даже если браузер изначально поддерживает промисы?   -  person levi    schedule 11.03.2016


Ответы (1)


Вышеупомянутое больше не работает, или не попало в спецификацию, или просто не реализовано traceur и/или узлом?

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

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

Вот список поддерживаемых в настоящее время реализаций.

person Benjamin Gruenbaum    schedule 30.03.2015