2011-06-23 32 views
2

是否可以使用我自己的函數編寫用於包裝任何node.js i/o-callback的代碼? (當我說I/O回調函數我的意思是在一些I/O動作後被調用的函數)自動包裝任何node.js回調

爲什麼我需要這樣的東西?例如:我有一個socket.io服務器 我有一堆全局函數,我實際上是作爲一個輸入(我不能改變它,甚至沒有讀它,我只是將它粘貼在我的代碼中)

socket.io.connect(socket,... callback)的回調函數與這些全局函數進行交互。現在在新連接時,我們在全局級別設置對當前套接字的訪問權限。 編寫這些全局函數的程序員都知道currentSocket變量並使用它..

問題是,在調用一些異步I/O函數後,其他用戶/套接字可能會連接並更改currentSocket,稍後異步I/O功能將得到執行currentSocket將等於不同的用戶/套接字,而不是原來的用戶/套接字,調用異步功能

我想也許我可以以某種方式自動換行I/O回調和關閉currentSocket變量,但我不知道該怎麼做... 任何想法?

var currentSocket = undefined; 
io.sockets.on('connection', function (socket) { 
    currentSocket = socket; 
    socket.on('msg', function (data) { 
    global[data.functionToInvoke]; 
    }); 
}); 

//global function that I can't change or even analyze/read 
//======================================================== 
function g1(){ 
    //might use currentSocket 
    //might invoke async stuff like 
    fs.readfile(...cb) 
} 
function g2(){ 
    //might use currentSocket 
    //might invoke async stuff like 
    redisClient.get(...cb) 
} 
+0

IM困惑,當你確定你要定義自己的函數回調...你所說的「包裹」是什麼意思? – hvgotcodes

+1

@hvgotcodes他可能意味着動態相交,而不是在所有事情上都這樣做。 @MrOhad不,但可以交叉_all_函數。 – Raynos

+1

好吧,讓我們假設別人寫回調... – DuduAlul

回答

2

如果你的函數全部共享currentSocket全局變量(如果你不能改變它們),不可能有多個連接(只要這些函數是異步的)。如果你可以改變它們,最好只是將套接字作爲第一個參數傳遞給你的函數。另一種方法是將currentSocket的定義和io.sockets connection回調內的函數移動。在這種情況下,currentSocket變量形式封閉,一切都應該按預期工作:

io.sockets.on('connection', function (socket) { 
    var currentSocket = socket; 
    socket.on('msg', function (data) { 
    global[data.functionToInvoke]; 
    }); 

    //global function that I can't change or even analyze/read 
    //======================================================== 
    function g1(){ 
    //might use currentSocket 
    //might invoke async stuff like 
    fs.readfile(...cb) 
    } 
    function g2(){ 
    //might use currentSocket 
    //might invoke async stuff like 
    redisClient.get(...cb) 
    } 

}); 
1

如果我正確理解你的問題,一種方法可以通過別名方法鏈來完成。你可以通過原來的回調到匿名函數表達式返回新的函數表達式:

cb = (function (original) { 
    return function() { 
    // do something with original callback 
    original(); 
    // add more functionality 
    } 
})(cb); 
0

如果你想要包裝的JS建立的方法來做到這一點是通過重命名&替換方式。

例如

Array.prototype._toString = Array.prototype.toString; 
Array.prototype.toString = function(){ return "wrapped["+this._toString()+"]"; }; 
console.log(["1","2","3"].toString()); 

我建議將其應用於你的使用情況,在這種情況下,無論是io.sockets對象,或者更深的對象,也許全部倒在EventEmitter.emit()方法的方式。