Подтвердить что ты не робот

Расширение Promises в ES6

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

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 (бег как 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(...) versus Promise.resolve(...)).

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

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

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

4b9b3361

Ответ 1

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

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

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

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