扩展ES6中的承诺

22 promise ecmascript-6 traceur es6-promise babeljs

我想扩展Promise:

class PersistedPromise extends Promise { }
Run Code Online (Sandbox Code Playgroud)

然后resolve在派生类上调用static 以直接创建已解析的promise:

PersistedPromise.resolve(1)
Run Code Online (Sandbox Code Playgroud)

在traceur中,这会产生:

ModuleEvaluationError: #<PersistedPromise> is not a promise
    at new PersistedPromise (~rtm/gen/promise.js:6:57)
    at Function.resolve (native)
Run Code Online (Sandbox Code Playgroud)

在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)
    ...
Run Code Online (Sandbox Code Playgroud)

我依赖于此:

Promise的所有静态方法都支持子类化:它们通过接收器创建新实例(想想:new this(...))并通过它访问其他静态方法(this.resolve(...)与Promise.resolve(.. )).

来自http://www.2ality.com/2014/10/es6-promises-api.html.

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

以上是不再有效,或者没有制定规范,或者只是没有由traceur和/或节点实现?

Ben*_*aum 20

以上是不再有效,或者没有制定规范,或者只是没有由traceur和/或节点实现?

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

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

以下是当前支持的实现列表.