9

我正在尝试在本机 Firefox 中代理 Promise(并使用 Babel)。

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

这不起作用,我在未实现接口 Promise 的对象上调用了“TypeError:'then'。”

4

2 回答 2

10

您需要让您的处理程序实现 get() 陷阱并返回的绑定版本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来更新它。

于 2015-06-13T13:54:28.307 回答
5

嗯,这个问题是How to Proxy a Promise。我来到这里是为了寻找How to Promise a Proxy ——或者更准确地说,是How to resolve a Proxy。我怀疑其他人也可能在这里登陆,所以我会在这里发布,以防万一。

我已经有一个很好的工作代理对象,然后我尝试将它包装在一个承诺中:

var p = new Promise(function(resolve, reject) {
  var proxy = get_my_proxy();
  resolve(proxy);
});

你不知道吗,然后该死的 resolve 方法向我的代理询问一个then属性(这是我的代理逻辑出乎意料的,导致它抛出)。这可能并不理想,具体取决于您的代理的用途,但这是我解决此问题的方法(并且足够恰当,因为我的问题与此问题相反,我的解决方案也是相反的) - 通过null返回then- - 从而让resolve()我知道我没有通过Promise(又名Thenable)。

get: function(target, prop) {
  if (prop === 'then') return null; // I'm not a Thenable
  // ...the rest of my logic
}
于 2018-12-21T21:21:04.950 回答