Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js NodeJS&;Socket.io:函数被其他用户调用终止时出现问题_Node.js_Sockets_Websocket_Socket.io - Fatal编程技术网

Node.js NodeJS&;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){

你好,我需要一些关于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){
    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中有一个类实例唯一的全局变量?