Приложение Electron останавливает рендеринг при запуске кода Javascript

1

В настоящее время я работаю над электронным приложением, которое по сути является пусковой установкой DDNS для управления сервером, которым я управляю. В основном, он проверяет подключение к Интернету, получает текущий IP-адрес для сервера, а затем открывает его в браузере по умолчанию. Однако всплывающий экран, который я написал, полностью сломан.

Всякий раз, когда я запускаю приложение в своей системе (используя npm из терминала), он загружает фрейм, но изображение замораживает загрузку примерно на 1/3 точки. Он не будет загружать оставшуюся часть изображения, пока скрипт не завершит выполнение его в нижней части основной HTML-страницы.

Есть что-то, что мне не хватает? При необходимости я могу предоставить отрывки кода.

РЕДАКТИРОВАТЬ:

Исходный код:

<script>
  function wait(ms) {
    var start = new Date().getTime();
    var end = start;
    while (end < start + ms) {
      end = new Date().getTime();
    }
  }

const isOnline = require('is-online');
const isReachable = require('is-reachable');
const {
  shell
} = require('electron');

window.onload = function() {
  // Main Script
  console.log('before');
  wait(3000);
  document.getElementById('progresstext').innerHTML = "Testing connection...";
  bar.animate(0.15); // Number from 0.0 to 1.0
  wait(250);
  var amIOnline = false;

  if (isOnline()) {
    amIOnline = true;
  }
  console.log("Internet Test Ran");

  if (!amIOnline) {
    document.getElementById('errortext').innerHTML = "ERROR: No internet connection. Check the internet connection.";
    document.getElementById('progresstext').innerHTML = "ERROR";
  }

  var isEmbyReachable = false;
  if (isReachable('******')) {
    isEmbyReachable = true;
    document.getElementById('progresstext').innerHTML = "Connection Test: Passed";
    //=> true
  }

  //Open Emby in the default browser
  if (amIOnline && isEmbyReachable) {
    shell.openExternal("*****");
  }
};

</script>

Ссылка Pastebin на полный источник: https://pastebin.com/u1iZeSSK

Спасибо

Характеристики системы разработки: macOS Mojave 10.14, Последняя стабильная сборка электрона

  • 0
    может быть смешанное использование 'onload' с 'DOMContentLoaded'? можешь показать какой-нибудь код?
  • 0
    Выложите пожалуйста код, который блокирует рендеринг
Показать ещё 1 комментарий
Теги:
electron

1 ответ

0
Лучший ответ

Проблема заключается в вашей функции wait, так как узел js является потоком в сигле, функция ожидания блокирует ваш процесс. Вы можете попробовать следующий код. Но я действительно рекомендую вам взглянуть на то, как писать асинхронные функции в JavaScript и setInterval и setTimeout в качестве запуска.

Но на время вы можете попробовать этот код.

window.onload = function () {
    // Main Script
    console.log('before');

    // wait 3 seconds
    setTimeout(function () {
        document.getElementById('progresstext').innerHTML = "Testing connection...";
        bar.animate(0.15); // Number from 0.0 to 1.0

        // wait 250 mills
        setTimeout(function () {
            var amIOnline = false;

            if (isOnline()) {
                amIOnline = true;
            }
            console.log("Internet Test Ran");

            if (!amIOnline) {
                document.getElementById('errortext').innerHTML = "ERROR: No internet connection. Check the internet connection.";
                document.getElementById('progresstext').innerHTML = "ERROR";
            }

            var isEmbyReachable = false;
            if (isReachable('******')) {
                isEmbyReachable = true;
                document.getElementById('progresstext').innerHTML = "Connection Test: Passed";
                //=> true
            }

            //Open Emby in the default browser
            if (amIOnline && isEmbyReachable) {
                shell.openExternal("*****");
            }
        }, 250)
    }, 3000)


};

Вы не можете пока или какие-либо другие блокирующие циклы ждать в JavaScript, поскольку он блокирует все другие исполнения, включая рендеринг страниц.

  • 1
    Попался. это сделало бы это. Спасибо за маленький урок в setTimeout. : D

Ещё вопросы

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