繁体   English   中英

如何在JavaScript中代理承诺es6

[英]How to Proxy a Promise in JavaScript es6

我正在尝试在原生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的对象。'

您需要让您的处理程序实现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对象时不会错误地调用该函数。

编辑:在某些情况下,浏览器/节点将有一个过时版本的代理,在这种情况下,您将需要使用和谐反射来使其更新。

嗯,这个问题是如何代理承诺 我来到这里寻找如何承诺代理 - 或者更确切地说, 如何解决代理 我怀疑其他人也可能会降落在这里,所以我会在这里发布,以防万一。

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

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

你不知道吗,然后darn resolve方法向我的代理询问then属性(这是我的代理逻辑意外,导致它抛出)。 它可能不是理想的,取决于你的代理是什么,但这是我如何解决这个问题(并且恰当地说,因为我的问题是这个问题的反面,我的解决方案也是反向的) - 通过返回null then - 因此让resolve()知道我没有传递给Promise (aka Thenable )。

get: function(target, prop) {
  if (prop === 'then') return null; // I'm not a Thenable
  // ...the rest of my logic
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM