2015-06-13 77 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)});

這是不行的,我得到「類型錯誤:‘然後’調用的對象不實現接口承諾上。」

+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時不會錯誤地調用該函數tive對象,如Promises或控制檯。

編輯:在某些情況下,瀏覽器/節點將有一個過時的代理版本,在這種情況下,您需要使用harmony-reflect以使其保持最新狀態。