在 ES6 中扩展 Promise

Posted

技术标签:

【中文标题】在 ES6 中扩展 Promise【英文标题】:Extending Promises in ES6 【发布时间】:2015-06-02 17:17:42 【问题描述】:

我正在尝试扩展 Promise:

class PersistedPromise extends Promise  

然后在派生类上调用静态resolve,直接创建resolved 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

似乎节点检查 this 调用诸如 Promise.resolve.call(this, val) 是否是 Promise,而不是(正确?)Promise 或其派生类 (v0. 12.0)。

上述内容是否不再有效,或者没有纳入规范,或者只是没有由 traceur 和/或节点实现?

【问题讨论】:

这应该可以工作。我的猜测是,这两个转译器都不支持。 New Viewers Note - 这个问题中的代码示例现在应该在 Babel 中编译和工作。 @BenjaminGruenbaum 我正在使用 Babel + ES2015 预设,当我调用构造函数 new ExtendedPromise(res =&gt; ) 时,我仍然得到 TypeError: #&lt;ExtendedPromise&gt; is not a promise。这还有什么其他的技巧吗? @sighrobot 可能是因为您没有使用 polyfill 和/或使用的是提供本机承诺的浏览器。 @BenjaminGruenbaum 谢谢! 【参考方案1】:

以上内容是否不再有效,或者没有纳入规范,或者只是没有由 traceur 和/或 node 实现?

规范中的 ES6 承诺支持子类化。也就是说,您最终将能够像刚才那样子类化 Promise。这是设计使然。

也就是说,目前没有一个浏览器在这方面正确遵循该规范——据我所知,只有 ES6-promise shim、Babel (core-js) 和 RSVP 在正确子类化方面遵循 ES6 语义。浏览器的支持最终会到来,但还没有。抱紧。

这是list of currently supporting implementations。

【讨论】:

以上是关于在 ES6 中扩展 Promise的主要内容,如果未能解决你的问题,请参考以下文章

ES6 Promise

ES6 Promise

ES6的Promise详解

ES6 - Promise 对象

ES6异步操作Promise

Web | ES6的异步编程