Фон
Наше приложение Electron в зависимости от контекста полагает, что определенные HTTP-ресурсы либо доступны, либо нет.Необходимо остановить дальнейшее выполнение кода, пока мы не получим результат от любого метода, который мы используем, чтобы выяснить состояние ресурса.Мы используем async / await и обернули большую часть настроек приложения в IIAFE.
Мы использовали пакет wait-on npm для опроса ресурса.Но если его ожидают из асинхронной функции, она никогда не стабилизируется и не заполняет очередь событий.В то время как ожидание вернулось и выполнение кода можно продолжить, Electron никогда не запускает событие app.ready.Возможно, потому что он ожидает пустую очередь событий.
Связанная проблема GitHub для ожидания: https://github.com/jeffbski/wait-on/issues/24
Попытка:
ВЧтобы обойти проблему, мы реализовали наш собственный способ опроса ресурсов, используя обещания и setTimeouts.Хотя у него нет такой же проблемы в вакууме - не позволяя завершить процесс, он все же блокирует запуск события app.ready.
Суть с примером кода: https://gist.github.com/arzmir/573cd7e0951528bc8905fe3cbac1a83f
Какой-то псевдокод для Электронной части
// In util.js
const askResourceToShutdownIfPresent = async () => {
sendHttpShutDownRequest(); // this may fail, but assume it's handled
return new Promise((resolve, reject) => {
try {
await waitOn(optionsForNonResponsiveResource);
resolve('yay');
} catch (err) {
reject('nay');
}
};
}
// In electron.main.js
(async () => {
app.on('ready', () => {
// Never gets in here because waitOn keeps filling event queue?
finishBootstrappingAndShowMainWindow();
})
await askResourceToShutdownIfPresent();
})();
Надеюсь, кто-то здесь сможет пролить свет на то, что мы делаем неправильно, и / или советы по обходным путям.