9

Proxy a 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: 'then' called on an object that not implement interface Promise.」というメッセージが表示されます。

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;
  }
});

bindPromise やコンソールなどのネイティブ オブジェクトを扱っているときに、関数が誤って呼び出されないようにします。

編集: 場合によっては、ブラウザ/ノードに古いバージョンのプロキシが含まれていることがあります。その場合は、harmony-reflectを使用して最新の状態にする必要があります。

于 2015-06-13T13:54:28.307 に答える