Расширение 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?
Ответы
Ответ 1
Является ли вышеуказанное более недействующим или не вписывается в спецификацию или просто не реализовано traceur и/или node?
ES6 promises в подклассе поддержки спецификации. То есть вы в конечном итоге сможете подклассифицировать promises так, как вы это делали. Это по дизайну.
Тем не менее, ни один из браузеров в настоящее время не следит за этой спецификацией в этом отношении - насколько я знаю только ES6-обещание, Babel (core-js) и RSVP следуют семантике ES6 относительно правильной подклассы. Поддержка в браузерах в конечном итоге приходит, но она еще не существует. Держитесь крепко.
Ниже представлен список поддерживаемых реализаций .