javascript - 自动包装任何 Node.js 回调

标签 javascript asynchronous node.js callback socket.io

是否可以编写用我自己的函数包装任何 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)
}

最佳答案

如果您的函数都共享 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)
  }

});

关于javascript - 自动包装任何 Node.js 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6457540/

相关文章:

javascript - Laravel 4 和 AngularJS - 带路由的干净 URL

javascript - 传递 ng-repeat 变量是未定义的

javascript - Sails.js Controller 等待异步服务方法

node.js - Kafka HLC 应如何计算出主题的分区数量?

javascript - .when 可以用 Angular $routeProvider 动态生成吗?

javascript - 如何从异步调用返回响应?

c++ - 类 std::result_of 中没有名为 'type' 的类型

c# - 使用 BuildManager.CreateInstanceFromVirtualPath 创建页面时,PageAsyncTasks 不会等待完成

javascript - 导入/导出名称冲突解决

javascript - NodeJSencodeURI 为 ß 生成错误的结果