自动包装任何node.jscallback

是否有可能编写代码来包装任何node.js I / Ocallback与我自己的function? (当我说I / Ocallback函数我的意思是在一些I / O操作后被调用的函数)

为什么我需要这样的事情? 例如:我有一个socket.io服务器我有一堆全球性的function,我实际上是作为一个input(我不能改变它,甚至没有读它,我只是把它粘贴在我的代码中)

socket.io.connect(socket,… callback)的callback与这些全局函数交互。 现在在新的连接上,我们在全局级别上设置对当前套接字的访问权限。 编写这些全局函数的程序员知道currentSocketvariables并使用它。

问题是,在调用一些asynchronousI / O函数之后,其他一些用户/套接字可能会连接并更改currentSocket,稍后在执行asynchronousI / O函数时,currentSocket将等于不同的用户/套接字,而不是原来的用户/套接字调用了asynchronous函数

我想也许我可以自动包装I / Ocallback和closurescurrentSocketvariables,但我不知道该怎么做…任何想法?

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

       

网上收集的解决方案 "自动包装任何node.jscallback"

如果你的函数都共享currentSocket全局variables(如果你不能改变它们),那么就不可能有多个连接(只要函数是asynchronous的)。 如果你可以改变它们,最好只是将套接字作为第一个parameter passing给你的函数。 另一种方法是将currentSocket和你的函数定义在io.sockets connectioncallback中。 在这种情况下, currentSocketvariables形成一个闭包,一切都应该按预期工作:

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

如果我正确理解你的问题,一个方法可以通过别名方法链来完成。 您可以将原始callback传递给匿名函数expression式,并返回新的函数expression式:

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

如果你想在JS中包装一个已build立的方法,那么通过重命名和replace。

例如

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

我build议把它应用到你的用例,在这种情况下,或者是io.sockets对象,或者是一个更深的对象,也许一直放在EventEmitter.emit()方法上。