【发布时间】:2017-04-18 05:31:09
【问题描述】:
我正在尝试用一种新方法来扩展 javascript 承诺。在这种情况下,这个新方法称为foo,它确实做了这样的事情:
Promise.foo = function(arg) {
return this.then( function(result) {
return result.foo(arg);
});
};
简而言之,foo() 函数是一个快捷方式,用于等待 promise 解决,然后在结果上调用 foo()。
这个函数的本质是可以链接,就像then()可以一样。
myPromise.foo(a).foo(b).foo(c);
我觉得这应该是可能的,但我只是不确定正确的路径是什么。
这是我尝试过的:
var FooPromise = function() {
Promise.apply(this, arguments);
}
FooPromise.prototype = Object.create(Promise.prototype);
FooPromise.foo = function(arg) {
return this.then( function(result) {
return result.foo(arg);
});
};
测试一下:
var test = new FooPromise(function(res, rej) {
res('bla');
});
在 Firefox 中,这给了我:
TypeError: calling a builtin Promise constructor without new is forbidden
在节点中:
TypeError: #<Promise> is not a promise
这只是javascript的限制,还是有办法解决这个问题?
【问题讨论】:
-
也许你应该使用
FooPromise.prototype.foo- 因为你将使用 FooPromise 的实例(为什么不首先将它添加到 Promise.prototype.foo 并且根本不使用 FooPromise) -至于你试图从 Promise “继承” - 它看起来有 3 种错误开始 -
什么是
result.foo? -
显然你可以不扩展
Promise而不使用@anete.anetes显示的ES6class FooPromise extends Promise语法,因为Promise会检查new.target是否被调用作为构造函数 - 如果不是,ECMA 规范中要求它抛出错误。 -
@JaromandaX 因为我只想在我的库的上下文中对其进行“子类化”,我不想做一个全局猴子补丁,因为我认为通常这是一种不好的做法。
标签: javascript promise