扩展内置的javascript Promise

时间:2017-04-18 05:31:10

标签: javascript promise

我试图用新方法扩展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的限制,还是有办法解决这个问题?

2 个答案:

答案 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