Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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
Javascript 卸载时发送SocketIO消息或卸载前确认时发送SocketIO消息_Javascript_Node.js_Socket.io - Fatal编程技术网

Javascript 卸载时发送SocketIO消息或卸载前确认时发送SocketIO消息

Javascript 卸载时发送SocketIO消息或卸载前确认时发送SocketIO消息,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我有一个服务器应用程序,通过无线电在远程设备上执行固件更新 有时更新可能会像永远一样继续(如果无线电网络中存在干扰)。在这种情况下,用户可能希望通过刷新或离开页面来中断更新。在这种情况下,我必须: 提醒用户他将要中断更新(不建议这样做),如果用户确定他的决定(并确认): 向服务器发送socketIO事件,通知应取消更新 我通过互联网搜索,找到了不同的解决方案。最好的方法是为全局对象事件onbeforeuload和onunload分配处理程序 使用onbeforeuload我别无选择。只有用户确

我有一个服务器应用程序,通过无线电在远程设备上执行固件更新

有时更新可能会像永远一样继续(如果无线电网络中存在干扰)。在这种情况下,用户可能希望通过刷新或离开页面来中断更新。在这种情况下,我必须:

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

  • 向服务器发送socketIO事件,通知应取消更新

  • 我通过互联网搜索,找到了不同的解决方案。最好的方法是为全局对象事件
    onbeforeuload
    onunload
    分配处理程序

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

    • 使用onload上的
      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)
    })
    
    服务器:修改断开连接事件以检查断开连接的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");
        };
    

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

    我所做的是将套接字事件放入
    window.addEventListener('unload',函数(e){})

    它很好地完成了任务

        window.addEventListener('beforeunload', function (e) {
            e.preventDefault();
            e.returnValue = ' ';
        });
    
    
        window.addEventListener('unload', function (e) {
            socket.emit('some event', {data to be sent});
        });