我试图用新方法扩展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的限制,还是有办法解决这个问题?
答案 0 :(得分:7)
ES6方式:
class FooPromise extends Promise {
constructor(executor) {
super(executor);
}
}
var fooPromise = new FooPromise((resolve,reject)=>{
resolve(null);
});
答案 1 :(得分:3)
经过更多的研究,我找到了以下解决方案。没有必要扩展内置的Promise。您真正需要的是确保您的对象正确实现then
(又名Promise / A + / thenable)。
function FooPromise(executor) {
this.innerPromise = new Promise(executor);
}
FooPromise.prototype = {
then: function(onFulfilled, onRejected) {
return new FooPromise(function(res, rej) {
this.innerPromise.then(res, rej);
});
},
foo: function() {
return this.then(function(val) {
return val.foo();
});
}
}
这在ES5环境中运行良好,可与其他承诺完美配合,甚至可以异步/等待(如果可用)。
我成功实施了这种模式this open source library。