Пример кнопки с отчетом таймера на Svelte, после или в течении которого происходит какое-нибудь событие. Это событие обновляет страницу или подтягивает данные аяксом без обновления.
В примере ниже, по кнопке запустить обновления, запускаются обновления и счетчик отчитывается до 0, после которого снова будет запущено обновление. И т.д. пока не отключить.
Первичное подключение функций svelte не связанных с таймером, но завязанных на нём: аякс запросы, которые подтягиваются на страницу.
import {onMount} from "svelte";
let updatedAtPortfolio, updatedAtPriceInPortfolio, updatedAtOperations, updatedAtPrices;
onMount(async () => {
getDates()
});
// Получение дат обновления
function getDates() {
updatedAtPortfolio = getFetch('get-updated-at-portfolio/');
updatedAtPriceInPortfolio = getFetch('get-updated-at-price-in-portfolio/');
updatedAtOperations = getFetch('get-updated-at-operations/');
updatedAtPrices = getFetch('get-updated-at-prices/');
}
function getUpdatedDate() {
getFetch('update-all-information/').then(() => {
getDates()
window.location.reload();
});
}
Непосредственно функции таймера в Svelte:
varSetTimeout,
timer = '-',
status = 'ВЫКЛ';
function setTimer() {
timer = 60;
status = 'ВКЛ';
document.cookie = 'svelteLiveUpdate=1';
varSetInterval = setInterval(() => {
if (timer > 0) timer--;
}, 1000);
varSetTimeout = setTimeout(function () {
// Запускаем обновление по окончанию таймера
getUpdatedDate();
// Сбрасывает таймер
clearInterval(varSetInterval);
clearTimeout(varSetTimeout);
setTimer();
}, 60000);
}
if (getCookie("svelteLiveUpdate") === '1') {
setTimer();
}
let stop = false;
function clickLiveReload() {
if (getCookie("svelteLiveUpdate") === '1') {
// Запускаем обновление при нажатии кнопки
if (!stop) {
getUpdatedDate();
stop = true;
}
document.cookie = 'svelteLiveUpdate=0';
clearInterval(varSetInterval);
clearTimeout(varSetTimeout);
timer = '-';
status = 'ВЫКЛ';
return;
}
setTimer();
}
</script>
Таблица на скрине. Здесь при клике на кнопку срабатывает функция clickLiveReload из кода выше. Она же запускает обновление, сохраняет куки и включает/выключает таймер на svelte.
<div class="body">
<div class="item link center" on:click={clickLiveReload}>
{#if timer === '-'}
<dic class="cell">Обновить и запустить автообновление</dic>
{:else}
<dic class="cell">Обновится через {timer} секунд</dic>
{/if}
</div>
{#await updatedAtPortfolio}
{:then updatedAtPortfolio}
<div class="item">
<div class="cell name">Портфель:</div>
<div class="cell date center">{updatedAtPortfolio}</div>
</div>
{/await}
{#await updatedAtPriceInPortfolio}
{:then updatedAtPriceInPortfolio}
<div class="item">
<div class="cell name">Тек. цены в портфеле:</div>
<div class="cell date center">{updatedAtPriceInPortfolio}</div>
</div>
{/await}
{#await updatedAtOperations}
{:then updatedAtOperations}
<div class="item">
<div class="cell name">Все операции:</div>
<div class="cell date center">{updatedAtOperations}</div>
</div>
{/await}
{#await updatedAtPrices}
{:then updatedAtPrices}
<div class="item">
<div class="cell name">Цены на {nameOfShare}:</div>
<div class="cell date center">{updatedAtPrices}</div>
</div>
{/await}
</div>
</div>