【发布时间】: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 => {})时,我仍然得到TypeError: #<ExtendedPromise> is not a promise。这还有什么其他的技巧吗? -
@sighrobot 可能是因为您没有使用 polyfill 和/或使用的是提供本机承诺的浏览器。
-
@BenjaminGruenbaum 谢谢!
标签: promise ecmascript-6 traceur es6-promise babeljs