2015-06-13 3 views
4

Я пытаюсь проксировать обещание в родном Firefox (и используя Babel).Как прокси обещание в JavaScript es6

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

Это не работает, я получаю 'TypeError: ' затем' называется на объекте, который не реализует интерфейс Promise.

+0

* Почему вы пытаетесь это сделать? Действительно, доверенное лицо для обещания не является самородным объектом обещания. Может быть, вы искали подклассы? – Bergi

ответ

4

Вы должны иметь свой обработчик 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 будет гарантировать, что функция не будет неправильно вызвана, когда вы имеете дело с Na таких как обещания или консоль.

EDIT: В некоторых случаях браузеры/узлы будут иметь устаревшую версию прокси, и в этом случае вы захотите использовать harmony-reflect, чтобы обновить ее.