在ES6中扩展Promise

23

我正在尝试扩展 Promise:

class PersistedPromise extends Promise { }

然后在派生类上调用静态resolve,直接创建一个已解决的promise:

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

看起来node检查调用中的this,例如Promise.resolve.call(this, val),以确保它是一个Promise,而不是(正确的?)Promise或其派生类(v0.12.0)。

以上内容已经失效了吗,还是没有进入规范,或者只是没有被traceur和/或node实现?


我认为那应该可以工作。我的猜测是两个转译器都不支持这个。 - Bergi
4
新观众须知:此问题中的代码示例现在应该可以在 Babel 中编译和运行。 - Benjamin Gruenbaum
2
@BenjaminGruenbaum 我正在使用Babel + ES2015预设,但是当我调用构造函数new ExtendedPromise(res => {})时仍然出现TypeError:#<ExtendedPromise>不是promise。还有其他技巧吗? - sighrobot
1
@sighrobot 可能是因为您没有使用 polyfill 或者您正在使用支持原生 Promise 的浏览器。 - Benjamin Gruenbaum
@BenjaminGruenbaum 谢谢! - sighrobot
@BenjaminGruenbaum 即使浏览器本地支持 promises,也需要使用 polyfill 吗? - levi
1个回答

21
上述内容不再有效,还是没有进入规范,或者仅未在traceur和/或node中实现?
规范中的ES6 Promise支持子类化。也就是说,您最终将能够像刚才那样对Promise进行子类化。这是设计上的考虑。
话虽如此,目前没有任何一款浏览器在这方面正确地遵循规范 - 据我所知,只有ES6-promise shim、Babel(core-js)和RSVP在关于子类化方面正确地遵循ES6语义。浏览器的支持最终会到来,但目前还没有到位。请耐心等待。
这里是当前支持实现列表

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接