扩展ES6中的承诺

时间:2015-03-29 19:06:37

标签: promise ecmascript-6 traceur es6-promise babeljs

我正在尝试扩展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

节点似乎检查thisPromise.resolve.call(this, val)之类的呼叫是Promise,而不是(正确?)Promise 或派生类(v0.12.0)。

以上内容是否已不再有效,或未进入规范,或者是否仅由traceur和/或节点实现?

1 个答案:

答案 0 :(得分:20)

  

以上内容是否已不再有效,或未进入规范,或者是否仅由traceur和/或节点实现?

ES6承诺在spec支持子类中。也就是说,您最终将能够以您刚才的方式继承承诺。这是设计的。

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

这是list of currently supporting implementations