自动包装任何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) }
如果你的函数都共享currentSocket
全局variables(如果你不能改变它们),那么就不可能有多个连接(只要函数是asynchronous的)。 如果你可以改变它们,最好只是将套接字作为第一个parameter passing给你的函数。 另一种方法是将currentSocket
和你的函数定义在io.sockets connection
callback中。 在这种情况下, currentSocket
variables形成一个闭包,一切都应该按预期工作:
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()方法上。
- nodejs中的jQuery.when()相当于什么?
- 以同步方式执行asynchronous调用
- 是否有可能build立一个dynamic的任务列表nodejsasynchronous(瀑布,系列等…)
- 如何在Node.js中从AWS getObject调用中返回variables
- 我如何做一个函数的asynchronous工作,然后完成后从该函数返回一个值?
- Node.js:asynchronous代码+ jsclosures的麻烦
- 多个asynchronous/等待try-catch块
- asynchronous – 传递variables和保存上下文
- 如何在Express请求处理程序中编写非阻塞asynchronous函数