Цикл обработки событий никогда не завершается из-за ожидания, поэтому событие Electron's app.ready никогда не запускается - PullRequest
0 голосов
/ 05 июля 2019

Фон

Наше приложение 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();
})();

Надеюсь, кто-то здесь сможет пролить свет на то, что мы делаем неправильно, и / или советы по обходным путям.

...