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источника его не ждёт, а его ошибки идут в отчёт.