javascript - 如何在 JavaScript es6 中代理 Promise

标签 javascript proxy-classes es6-promise

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

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

这不起作用,我收到“TypeError:‘then’调用了一个未实现接口(interface) Promise 的对象。”

最佳答案

你需要有你的处理程序 implement the get() trap并返回 prom.then

绑定(bind)版本
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 或控制台)时不会错误地调用该函数。

编辑:在某些情况下浏览器/节点将有一个过时的代理版本,在这种情况下你会想要使用 harmony-reflect使其保持最新状态。

关于javascript - 如何在 JavaScript es6 中代理 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30819290/

相关文章:

javascript - 我如何在 js 中创建一个形状像钻石的 promise 链

javascript - 循环多个select对象的多个option,并根据SQL查询结果select options

javascript - 使用 data 属性中的值作为 url 参数

php - 在运行时在php中动态生成类?

qt - Qt 中模型的任意索引作为 View 的根索引?

ruby-on-rails - ruby 中是否有 promise 概念?

javascript - 等待 x 个 promise 完成后生成新 promise 的好模式是什么?

javascript - Preg_match 验证仅允许一个特殊字符

javascript - 从另一个树构建递归树

java - 转换代理 - 获取 ClassCastException