Я вижу много сообщений об ограничении скорости без потерь, но это не совсем то, что я пытаюсь сделать. У меня есть событие, которое срабатывает один раз при каждом http-вызове в моем приложении angular 9, которое запускает другое событие, которое делает отдельный http-вызов. Однако я не хочу, чтобы этот вызов происходил постоянно с каждым отдельным событием, я просто хочу, чтобы он срабатывал один раз, как каждые x секунд, но только при активном выполнении http-вызовов. Меня не волнует потеря промежуточных событий. Я играл с различными комбинациями takeUntil, interval и некоторыми другими вещами, но на самом деле ничего не работает так, как я хочу. Надеялся, что у вас, умных людей, будут какие-то предложения.
Я не сохранил ничего из этого, извините, так как ничего из этого не сработало. Я как раз на той стадии, когда я лихорадочно ищу в Интернете, пытаясь собрать воедино похожие примеры или найти кого-то, кто пытался сделать что-то подобное.
Я думаю, что, возможно, выхлоп / выхлопная карта будет способом сделать это ...
Вы можете сделать это с помощью exhaustMap и искусственно расширенной внутренней наблюдаемой. Мы можем искусственно продлить вызов, объединив его с беззвучным таймером. Таким образом, внутренняя наблюдаемая завершается только тогда, когда завершается последняя из объединенных наблюдаемых. При этом значения из source$ игнорируются.
В этом примере мы перестаем игнорировать источник $ каждые 10 секунд (если внутренний наблюдаемый объект не занимает больше времени, мы продолжаем ждать).
Это может выглядеть так:
const tenSeconds = 10000;
// source$ emits when http calls being made
source$.pipe(
exhaustMap(_ => merge(
separateHttpCall(),
timer(tenSeconds).pipe(
filter(_ => false)
)
))
)
Это работает довольно хорошо, и на самом деле довольно близко к тому, с чего я начал. Я пытался использовать задержку, чтобы сделать это, но это имеет гораздо больше смысла в ретроспективе. Спасибо!
Можете ли вы опубликовать код, который вы пробовали?