gpt4 book ai didi

javascript - 在卸载时或卸载前确认时发送 SocketIO 消息

转载 作者:太空宇宙 更新时间:2023-11-04 00:06:49 24 4
gpt4 key购买 nike

我有一个服务器应用程序,可以通过 radio 在远程设备上执行固件更新。

有时更新可能会永远持续下去(如果 radio 网络出现干扰)。在这种情况下,用户可能希望通过刷新或离开页面来中断更新。在这种情况下我必须:

  1. 提醒用户他即将中断更新(不建议这样做),并且如果用户确定他的决定(并确认):

  2. 向服务器发送一个 socketIO 事件以通知应取消更新。

我在互联网上搜索并找到了不同的解决方案。其中最好的是将处理程序分配给全局对象事件 onbeforeunloadonunload

  • 使用onbeforeunload我别无选择。仅当用户确认时才能发送 SocketIO 消息,并且如果用户决定等待更新完成则不执行任何操作。我可以将 SocketIO 消息发送到服务器,但如果用户决定等待怎么办?伤害已经造成了。

  • 使用onunload - 似乎对我不起作用。我看到套接字事件正在由浏览器发送,但在服务器处理之前连接已关闭。

有什么方法可以保持 SocketIO 连接或延迟浏览器刷新以便服务器可以处理事件吗?

我认为这是服务器的问题,因为它运行在资源非常有限的 CPU 上,甚至 CPU 速度也是如此。 ARM A7架构。

最佳答案

有一个办法:

服务器:创建用户 ID:

var custom_id = 0;
io.engine.generateId = (req) => {
let id = custom_id++;
return id++; // very basic but unique id
}

服务器:创建一个尝试关闭事件的监听器并存储用户 ID 尝试:

var userAttempt = 0;

socket.on('attempt to close', function(data){
userAttempt = socket.id;
console.log(data)
})

服务器:修改disconnect事件来检查哪个id用户已断开连接:

socket.on('disconnect', function(){
if(userAttempt === socket.id){
console.log("user attempt and close");
//the update should be canceled !!!!
}
console.log('user disconnected');
});

客户端:在onbeforeunload内创建尝试关闭事件发射器,如果用户尝试关闭或重新加载页面,则始终会触发此事件。

window.onbeforeunload = function (e) {
e.returnValue = " ";
var socket = io();
socket.emit('attempt to close', "user attempt to close");
};

如果用户尝试关闭选项卡,我们会触发尝试关闭事件,我们会检查用户是否关闭选项卡,并检查断开连接事件。如果用户断开连接与用户尝试关闭相同,则应取消更新。

关于javascript - 在卸载时或卸载前确认时发送 SocketIO 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51894161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com