Как установитьInterval () в электронном BrowserWindow? - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть простое приложение Electron, которое запрашивает базу данных SQL и отображает вывод в виде таблицы HTML. У меня все работает корректно, но теперь мне нужно «refre sh» таблицы HTML каждые X минут (с новыми результатами запроса SQL).

Прямо сейчас у меня есть работает правильно, используя метатег непосредственно в HTML с: http-эквивалент = "refre sh" content = "300". Это корректно обновляет страницу каждые 5 минут, а это именно то, что мне нужно.

Хотя проблема в том, что refre sh заставляет экран go белый, пока выполняется запрос SQL и HTML построен. Очевидно, что лучшим решением было бы использовать DOM и изменять только те ячейки, которые действительно изменились, начиная с последнего refre sh. Проблема, с которой я сталкиваюсь, заключается в том, чтобы заставить setInterval работать правильно ... Еще раз, это ОЧЕНЬ ПРОСТОЕ электронное приложение. Я использую их стартовую котельную плиту. Я попытался добавить "setInterval" в тег <body>, используя такой код:

<body onload='setInterval(updateTable(), 300000);'>

, но код срабатывает только один раз ... Я также попытался добавить следующий код в конце тело (только внутри тега </body>):

<script>
    window.onload=function(e){
        setInterval(updateTable(), 300000);
    }
</script>

... удаление его из обработчика window.onload ...:

<script>
    setInterval(updateTable(), 300000);
</script>

... а также переместив его в файл "renderer. js":

setInterval(updateTable(), 300000);

во всех случаях, он срабатывает только один раз ... Я знаю это, потому что первая строка кода в updateTable () выводит текущий дата и время для консоли, через console.log () ..

Я попытался уменьшить значение тайм-аута до 10 секунд (с 300000 до 10000), просто чтобы мне не пришлось так долго ждать тестирование и это не имело никакого значения. Я подозреваю, что проблема, с которой я столкнулся, связана с моим отсутствием знаний об электронной структуре (например, о различных «процессах»), и я уже два дня ищу решения, но безуспешно. Любой совет о том, как я могу сделать это sh, ОЧЕНЬ ЦЕНЕН!

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

TL; DR

Ваша проблема не имеет ничего общего с Электроном, а скорее с тем, что именно вы передаете setInterval. Вы передаете не функцию updateTable, а результат вызова функции updateTable(). Удалите скобки после имени функции.

Анализ

Обе функции setInterval и setTimeout ожидают функцию в качестве первого параметра, который они будут вызывать при уточняйте c раз или регулярно. Однако то, что вы передаете setInterval, не является функцией. Вы пишете:

setInterval(updateTable(), 10000)

Когда эта строка выполняется, вызывается updateTable и ее возвращаемое значение передается в setInterval. (Если функция явно ничего не возвращает, она возвращает undefined.) Вот почему ваша функция вызывается только один раз (при настройке таймера).

Если вы пишете

setInterval(updateTable, 10000) // no parentheses

вы фактически передаете функцию в setInterval, которая затем будет запускать ее несколько раз.

Вы можете удивиться, почему ваш обходной путь, использующий setTimeout, работает. Это потому, что вы фактически передаете ему функцию. Вы указываете встроенную функцию, но не вызываете ее в то время. Неважно, что внутри этой функции, вы делаете вызов updateTable. Важно то, что вы передаете функциям таймера.

0 голосов
/ 03 февраля 2020

Я нашел исправление / обходной путь ... либо есть «ошибка» с setInterval, либо (что наиболее вероятно) я что-то упустил из-за моей «новизны» в фрейкворке. Но вместо использования setInterval я переключился на setTimeout, затем в функции обратного вызова после вызова updateTable () я просто установил другой setTimeout. По какой-то причине это работает отлично .... в основном, в "рендерере. js" я заменил:

setInterval(updateTable(), 10000);

на

let timer = setTimeout(function refreshTimer() {
    updateTable();
    timer = setTimeout(refreshTimer, 10000);
  }, 10000);

Даже если они функционально эквивалентны по какой-то причине теперь работает отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...