Node.js NodeJS&;Socket.io:函数被其他用户调用终止时出现问题
你好,我需要一些关于socket.io的帮助 在我的应用程序中,用户需要连接到我的socket.io服务器,然后服务器启动一个进程并向客户端发送进度更新。 代码如下所示:Node.js NodeJS&;Socket.io:函数被其他用户调用终止时出现问题,node.js,sockets,websocket,socket.io,Node.js,Sockets,Websocket,Socket.io,你好,我需要一些关于socket.io的帮助 在我的应用程序中,用户需要连接到我的socket.io服务器,然后服务器启动一个进程并向客户端发送进度更新。 代码如下所示: var MyProcess = require( './myProcess.js' ); var WebSocket = require( './class.websocket.js' ); var w = new WebSocket(8080); w.on('connexion', function(socket){
var MyProcess = require( './myProcess.js' );
var WebSocket = require( './class.websocket.js' );
var w = new WebSocket(8080);
w.on('connexion', function(socket){
console.log('new client connected');
(...)
// client launch the process
socket.on('process', function () {
processAction( socket);
});
});
function processAction( socket )
{
var f = new MyProcess();
f.doProcess(function(percent){
// progress received, (100 calls during 2-3mins)
socket.emit("onProgress", percent);
},function(){
// process completed (only one call)
socket.emit("onComplete");
});
}
它对一个用户非常有效。
问题是,当第二个用户连接时,函数processAction()似乎被终止或重写。第二个用户接收他的进度,但第一个用户不再接收任何数据
[编辑]每个用户只需要接收其流程的进度。就像NodeJS无法处理同时运行的两个processAction()。第二次调用它会终止上一次调用以及其中的局部变量
你能帮我弄清楚这个吗?
非常感谢你。
Anthony所以解决方案(感谢jfriend00)是我在这样做:
var onProgress;
function MyProcess(){}
MyProcess.prototype.doProcess=function( pOnProgress)
{
onProgress = pOnProgress;
_doProcess();
}
function _doProcess()
{
console.log("tick");
onProgress();
setTimeout(_doProcess, 1000);
}
module.exports = MyProcess;
与此相反:
function MyProcess(){}
MyProcess.prototype.doProcess=function( onProgress)
{
_doProcess(onProgress);
}
function _doProcess(onProgress)
{
console.log("tick");
onProgress();
setTimeout(_doProcess, 1000, onProgress);
}
module.exports = MyProcess;
或者这个:
function MyProcess(){}
MyProcess.prototype.doProcess = function( onProgress)
{
this.onProgress = onProgress;
_doProcess(this);
}
function _doProcess(scope)
{
console.log("tick");
scope.onProgress();
setTimeout(_doProcess, 1000, scope);
}
module.exports = MyProcess;
为什么不将
套接字
传递给processAction()
,因为这似乎正是您想要的?f.doProcess做什么?它是否使用任何全局变量或模块状态变量?是的,直接传递“套接字”更容易。doProcess()实际上使用Curl执行长进程,因此onProgress回调将在2-3分钟内调用一段时间。我的问题是.doProcess()
是否具有某些全局状态,当多个套接字同时运行时会导致冲突。谢谢。你是对的,这是因为全局变量。我认为它们是MyProcess实例所独有的,所以我将onProgress回调和所有其他数据存储在那里。但事实上,它们对于整个应用程序是唯一的,并且在下一个用户调用MyProcess的新实例时被覆盖。所以我们不能在JS中有一个类实例唯一的全局变量?