#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 .
Некоторые вещи, которые я рассмотрел:
- вместо этого используйте основной процесс electron — это решило бы условие гонки, но у него нет доступа к websocket.
- вставьте цикл for после вызова «postMessage» — это работает большую часть времени, но, мальчик, это не кажется хорошим подходом.
- async / await — beforeunload не заботится об асинхронном ожидании, оно движется вперед, и окно закрывается.
- окно.alert() и тому подобное — они, похоже, не отображаются, и даже если они сработали, я не хочу беспокоить пользователя, когда он закрывает окно.
Мой вопрос — как я могу гарантировать, что сообщение websocket будет отправлено работником до выхода из моего окна пользовательского интерфейса Electron? Существуют ли разные хуки / уведомления, которые я должен использовать для этого?
Комментарии:
1. Разве вы не можете просто прослушать onclose wvent на другой стороне? Как насчет системы маяков? Если получатель не получит новое сообщение через x секунд, считайте его закрытым.
2. Неплохое предложение — соединение с websocket не должно прерываться до завершения работы, так что это может сработать. Я был бы рад принять ответ в этом направлении.