Отправить сообщение SocketIO при выгрузке или при подтверждении перед загрузкой

1

У меня есть серверное приложение, которое выполняет обновление прошивки на удаленных устройствах по радио.

Иногда обновление может продолжаться как всегда (если в радиосети есть помехи). В этом случае пользователь может пожелать прервать обновление, обновив или покинув страницу. В этом случае я должен:

  1. Оповестите пользователя о том, что он собирается прервать обновление (что не рекомендуется), и если пользователь уверен в своем решении (и подтвердит):

  2. Отправьте событие socketIO на сервер, чтобы сообщить, что обновление должно быть отменено.

Я искал через интернет и сталкивался с различными решениями. Лучшие из них назначают обработчики для глобальных событий объекта onbeforeunload и onunload.

  • Использование onbeforeunload у меня нет выбора. Не удается отправить сообщение SocketIO только в том случае, если пользователь подтвердит и ничего не сделает, если пользователь решил дождаться завершения обновления. Я могу отправить сообщение SocketIO на сервер, но что, если пользователь решит подождать? Ущерб уже сделан.

  • Использование onunload - кажется, что это не работает для меня. Я вижу, что событие сокета отправляется браузером, но перед обработкой сервером соединение закрывается.

Есть ли способ сохранить соединение SocketIO или задержать обновление браузера, чтобы сервер мог обработать событие.

Я думаю, что это проблема на сервере, потому что он работает на процессоре с очень ограниченными ресурсами, даже с частотой процессора. Это архитектура ARM A7.

Теги:
socket.io

1 ответ

0

Есть выход:

Сервер. Создайте идентификатор пользователя с помощью:

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

Сервер. Создайте прослушиватель, чтобы попытаться закрыть событие и сохранить попытку пользователя.

var userAttempt = 0;

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

Сервер. Измените событие разъединения, чтобы проверить, какой идентификатор пользователя отключен:

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

Клиент. Создайте попытку эмиттера события закрыть внутри onbeforeunload, это событие всегда будет onbeforeunload, если пользователь попытается закрыть или перезагрузить страницу.

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

Если пользователь попытается закрыть вкладку, мы запускаем попытку закрытия события, мы проверяем, закрывается ли пользователь или нет вкладка, проверяющая событие разъединения. Если пользователь отключен, то, как пользователь попытался закрыть, обновление должно быть отменено.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню