如何在JavaScript中代理承诺es6

时间:2015-06-13 13:35:47

标签: javascript proxy-classes es6-promise

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



var prom = new Promise(function(resolve, reject){resolve(42)});
var promProxy = new Proxy(prom, {});
promProxy.then(function(response){console.log(response)});




这不起作用,我得到' TypeError:'然后'调用了一个没有实现接口Promise的对象。'

2 个答案:

答案 0 :(得分:7)

您需要拥有处理程序implement the get() trap并返回prom.then绑定版本

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将确保在您处理诸如Promises或控制台之类的Native对象时,不会错误地调用该函数。

编辑:在某些情况下,浏览器/节点将拥有过时的代理版本,在这种情况下,您希望使用harmony-reflect来更新它。

答案 1 :(得分:0)

嗯,这个问题是如何代答承诺。我到达这里是在寻找如何承诺代理人-或者更准确地说,是如何解决代理人。我怀疑其他人也可能会降落在这里,因此,以防万一,我会将其张贴在这里。

我已经有一个不错的工作代理对象,然后我尝试将其包装在一个Promise中:

flex specs.l
g++ lex.yy.c
a.exe test.txt

您不知道吗,然后darn resolve方法向我的代理请求一个var p = new Promise(function(resolve, reject) { var proxy = get_my_proxy(); resolve(proxy); }); 属性(这是我的代理逻辑所意外的,导致它抛出)。可能并不理想,具体取决于您的代理服务器的用途,但这是我如何解决此问题的方法(并且很恰当,因为我的问题是该问题的逆,我的解决方案也是如此)-通过返回{{ 1}}代表then,从而使null知道我没有通过then(也称为resolve())。

Promise