我试图在前端显示进度条,以了解服务器上发生的进程。我尝试使用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
我想知道是否有解决方法或更好的方法来实现它。
答案 0 :(得分:0)
通过名称writeFileAsync是一个异步函数,所以每当异步返回时 回调发出事件,真正显示进展。