是否可以编写用我自己的函数包装任何node.js i / o-callback的代码? (当我说i / o-callback函数时,我指的是在执行一些i / o操作后调用的函数)
为什么我需要这样的东西?示例:我有一个socket.io服务器 我有一堆全局函数,我实际上是作为输入获取(我无法更改它,甚至不读它,我只是将其粘贴在我的代码中)
socket.io.connect(socket,... callback)的回调与这些全局函数进行交互。现在,在新连接时,我们在全局级别设置对当前套接字的访问。 编写这些全局函数的程序员都知道currentSocket变量并使用它..
问题是在调用了一些异步i / o函数后,其他一些用户/套接字可能会连接并更改currentSocket,稍后当async i / o函数执行时,currentSocket将等于另一个用户/套接字而不是调用async-function
的原始用户/套接字我想也许我可以以某种方式自动换行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 :(得分: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 :(得分:1)
如果我正确理解你的问题,可以通过别名方法链实现它。您可以将原始回调传递给匿名函数表达式,该表达式返回新的函数表达式:
cb = (function (original) {
return function () {
// do something with original callback
original();
// add more functionality
}
})(cb);
答案 2 :(得分:0)
如果你想在JS中包装一个已建立的方法,那么通过重命名&取代
e.g。
Array.prototype._toString = Array.prototype.toString;
Array.prototype.toString = function(){ return "wrapped["+this._toString()+"]"; };
console.log(["1","2","3"].toString());
我建议将它应用于你的用例,在这种情况下是io.sockets对象,或者是更深层次的对象,可能一直在EventEmitter.emit()方法中。