Skip to content

delay

Сдвигает каждое срабатывание на фиксированное время. Ничего не объединяет и не ограничивает — каждое значение просто приходит на ms позже, в исходном порядке.

ts
delay(source, ms);

Стор даёт стор, событие даёт событие.

Тосты, которые прячутся сами

Показать при сохранении, скрыть через три секунды:

ts
const saved = event<void>();
const hideToast = delay(saved, 3000);

reaction({ on: saved, run: () => { toastVisible.value = true; } });
reaction({ on: hideToast, run: () => { toastVisible.value = false; } });

Два сохранения подряд — два сигнала скрытия, каждый по своему расписанию: тост от второго сохранения не оборвётся таймером первого.

Окно «отменить»

Дать пользователю пять секунд передумать:

ts
const deleted = event<Item>();
const committed = delay(deleted, 5000);

reaction({ on: deleted, run: (item) => { pendingUndo.value = item; } });
reaction({ on: committed, run: (item) => {
  if (pendingUndo.value?.id === item.id) void purgeFx(item); // undo очищает pendingUndo
} });

Когда пригодится

  • Интерфейс, который реагирует «мгновением позже»: тосты, подсказки с задержкой, ступенчатые анимации.
  • Окна undo и прочие «выполнить, если не отменили» — отложенное событие плюс проверка, как выше.

Когда не подходит: повторяющиеся тики — это interval, «после конца всплеска» — debounce. И не стройте на delay таймауты запросов: отмена — работа signal у эффекта.

Поведение

  • Каждое срабатывание планируется отдельноdelay никогда не сливает значения и ничего не выбрасывает.
  • Таймеры у каждого скоупа свои; dispose владельца отменяет все невыстрелившие.
  • Отложенное срабатывание — отдельное обновление: await источника его не ждёт, а его ошибки идут в отчёт.