Выполнить асинхронную задачу до закрытия электронного окна

#javascript #electron #web-worker

#javascript #electron #веб-работник

Вопрос:

У меня есть приложение electron, работающее с Angular для пользовательского интерфейса в окне браузера. Приложение Angular запускает web-worker, который открывает соединение websocket с внешним приложением. Я хотел бы отправить определенное сообщение через websocket до закрытия моего приложения, чтобы сигнализировать внешнему приложению о закрытии.

Прямо сейчас я использую событие beforeunload в пользовательском интерфейсе (в службе Angular):

 window.addEventListener('beforeunload', (event) => {

    // Simplified version of sending the shutdown command
    this.webWorker.postMessage("shutdown");

});
  

Рабочий отвечает (в отдельном потоке) на эту команду, немедленно отправляя команду завершения работы через websocket.

Это вводит условие гонки — что произойдет первым? Окно браузера закрывается и убивает веб-работника? Или веб-работник, отправляющий сообщение websocket в отдельном потоке? Часто во время разработки это последнее, но во время производства с оптимизированным кодом кажется, что первое (но не всегда).

По сути, моя проблема заключается в том, что хук beforeunload не может дождаться завершения асинхронной задачи, поэтому я не могу настроить его на ожидание, пока внешнее приложение не подтвердит, что оно получило команду websocket .

Некоторые вещи, которые я рассмотрел:

  1. вместо этого используйте основной процесс electron — это решило бы условие гонки, но у него нет доступа к websocket.
  2. вставьте цикл for после вызова «postMessage» — это работает большую часть времени, но, мальчик, это не кажется хорошим подходом.
  3. async / await — beforeunload не заботится об асинхронном ожидании, оно движется вперед, и окно закрывается.
  4. окно.alert() и тому подобное — они, похоже, не отображаются, и даже если они сработали, я не хочу беспокоить пользователя, когда он закрывает окно.

Мой вопрос — как я могу гарантировать, что сообщение websocket будет отправлено работником до выхода из моего окна пользовательского интерфейса Electron? Существуют ли разные хуки / уведомления, которые я должен использовать для этого?

Комментарии:

1. Разве вы не можете просто прослушать onclose wvent на другой стороне? Как насчет системы маяков? Если получатель не получит новое сообщение через x секунд, считайте его закрытым.

2. Неплохое предложение — соединение с websocket не должно прерываться до завершения работы, так что это может сработать. Я был бы рад принять ответ в этом направлении.