如何在JavaScript es6中代理承诺

如何在JavaScript es6中代理承诺,javascript,proxy-classes,es6-promise,Javascript,Proxy Classes,Es6 Promise,我正试图在原生Firefox中代理一个承诺(并使用Babel) var prom=newpromise(函数(解析,拒绝){resolve(42)}); var promProxy=新代理(prom,{}); 然后(函数(响应){console.log(响应)})您需要处理程序并返回绑定版本的prom。然后 var prom = new Promise(function(resolve, reject){resolve(42)}); var promProxy = new Proxy(prom

我正试图在原生Firefox中代理一个承诺(并使用Babel)

var prom=newpromise(函数(解析,拒绝){resolve(42)});
var promProxy=新代理(prom,{});

然后(函数(响应){console.log(响应)})您需要处理程序并返回绑定版本的
prom。然后

var prom = new Promise(function(resolve, reject){resolve(42)});
var promProxy = new Proxy(prom, {
  get: function(target, prop) {
    if (prop === 'then') {
      return target.then.bind(target);
    }
  }
});
promProxy.then(function(response){console.log(response)});
请注意,如果您只是想代理所有访问者,那么
get
函数如下所示:

var promProxy = new Proxy(prom, {
  get: function(target, prop) {
    var value = target[prop];
    return typeof value == 'function' ? value.bind(target) : value;
  }
});
bind
将确保在处理本机对象(如承诺)或控制台时不会错误调用该函数


编辑:在某些情况下,浏览器/节点的代理版本会过时,在这种情况下,您需要使用它更新代理版本。

嗯,这个问题是如何代理承诺。我来到这里是想了解如何承诺代理——或者更准确地说,如何解决代理。我怀疑其他人也会在这里着陆,所以我会把这个贴在这里,以防万一

我已经有了一个很好的工作代理对象,然后我去尝试用承诺来包装它:

var p = new Promise(function(resolve, reject) {
  var proxy = get_my_proxy();
  resolve(proxy);
});
您难道不知道吗,然后darn resolve方法向我的代理请求
then
属性(这是我的代理逻辑意外的,导致它抛出)。这可能并不理想,这取决于您的代理的用途,但下面是我如何解决这一问题的(适当地说,因为我的问题与此相反,我的解决方案也是相反的)——为
返回
null
,然后
——从而让
resolve()
知道我没有通过
承诺
(又名
表格


你为什么要这样做?事实上,promise的代理不是原生promise对象。也许你在寻找子类化?只是遇到了这个问题,感谢你的回答
get: function(target, prop) {
  if (prop === 'then') return null; // I'm not a Thenable
  // ...the rest of my logic
}