Javascript 自动包装任何node.js回调

Javascript 自动包装任何node.js回调,javascript,asynchronous,node.js,callback,socket.io,Javascript,Asynchronous,Node.js,Callback,Socket.io,是否可以编写代码,用我自己的函数包装任何node.js i/o回调? (当我说I/o回调函数时,我指的是在某些I/o操作后被调用的函数) 我为什么需要这样的东西?示例:我有一个socket.io服务器 我有一堆全局函数,实际上是作为输入获取的(我不能更改它,甚至不能读取它,我只是按照代码中的原样粘贴它) socket.io.connect(socket,…callback)的回调与这些全局函数交互。现在,在新连接上,我们在全局级别设置对当前套接字的访问。 编写这些全局函数的程序员知道并使用cur

是否可以编写代码,用我自己的函数包装任何node.js i/o回调? (当我说I/o回调函数时,我指的是在某些I/o操作后被调用的函数)

我为什么需要这样的东西?示例:我有一个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)
}

如果我正确理解了您的问题,那么实现它的一种方法就是通过alias方法链。可以将原始回调传递到匿名函数表达式中,匿名函数表达式返回新的函数表达式:

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

如果您想在JS中包装一个已建立的方法,方法是重命名和替换

e、 g


我建议将其应用到您的用例中,在本例中可以是io.sockets对象,也可以是更深层的对象,可能是EventEmitter.emit()方法的底层。

如果您的函数都共享
currentSocket
全局变量(如果您无法更改它们),则不可能有多个连接(只要函数是异步的)。如果可以更改它们,最好只将套接字作为第一个参数传递给函数。另一种方法是将
currentSocket
的定义和函数移动到
io.sockets连接
回调中。在这种情况下,
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)
  }

});

我很困惑,当你定义回调函数时,你是在定义自己的函数……你说的“wrap”是什么意思?@hvgotcodes他可能指的是动态交集,而不是在所有函数上都进行交集。@MrOhad不,但你可以交集所有函数。好吧,让我们假设是其他人编写了回调函数…@Raynos你能详细说明一下吗?@Raynos谢谢,但是那就去接电话怎么样?你知道我该怎么写这样一个插件吗?再次感谢!
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)
  }

});