Socket.IO

时间:2017-09-15 13:01:12

标签: javascript node.js loops socket.io progress-bar

我试图在前端显示进度条,以了解服务器上发生的进程。我尝试使用emits通过websockets( SocketIO )发送进度更新消息,但我面临的问题是,当不同的循环完成时,它们全部聚集在一起,而不是他们被释放了。

这真的很简单,我正在使用的代码。

//Server side function
functionThatShouldEmitInTime(data){
    readFileWithCallback(data, function(dataUpdated){
        readFileWithCallback(dataUpdated, function(dataEvenMoreUpdated){
            var w = dataEvenMoreUpdated.w;
            for (var c in w) {
                for (var e in c){
                    var to_be_filled;
                    //Do stuff
                    for (var a in e) {
                        //do stuff with to_be_filled
                        for(var pr in a){
                            //do stuff with to_be_filled
                            for(var pe i pr){
                                //do stuff with to_be_filled
                            }
                        }
                    }
                    writeFileAsync(to_be_filled);
                    console.log(to_be_filled.name + ' is being written');
                    socket.emit('file:processed', 'type_of_file');
                }
            }
        });
    });
};

这种方法很好,只有发出,在所有循环结束时发送。因此,客户端的进度会立即显示并在操作结束时显示。不会逐渐发生。

我尝试通过以下修改强制节点发出。使用 process.nextTick();

//Server side function
functionThatShouldEmitInTime(data){
    readFileWithCallback(data, function(dataUpdated){
        readFileWithCallback(dataUpdated, function(dataEvenMoreUpdated){
            var w = dataEvenMoreUpdated.w;
            for (var c in w) {
                for (var e in c){
                    var to_be_filled;
                    //Do stuff
                    for (var a in e) {
                        //do stuff with to_be_filled
                        for(var pr in a){
                            //do stuff with to_be_filled
                            for(var pe i pr){
                                //do stuff with to_be_filled
                            }
                        }
                    }
                    writeFileAsync(to_be_filled);
                    console.log(to_be_filled.name + ' is being written');
                    process.nextTick(force_emit);
                }
            }
        });
    });
};

function force_emit() {
    socket.emit('file:processed', 'type_of_file');
}

我还阅读并尝试了此StackOverflow帖子中的所有信息,但没有成功:

Sending Multiples Emits Inside a Loop

Nodejs SocketIO Emit Function Loop

SocketIo Emit in Loop Until Client Responds

SocketIo Inside Loop Does Not Work

我想知道是否有解决方法或更好的方法来实现它。

1 个答案:

答案 0 :(得分:0)

通过名称writeFileAsync是一个异步函数,所以每当异步返回时 回调发出事件,真正显示进展。