Вот мой подход:
let shouldSkipFalsy = false;
merge(
of(true), // Start spinner
of(false), // Ignored
of(false), // Ignored
of(false), // Ignored
timer(400).pipe(mapTo(false)), // Ignored
timer(10000).pipe(mapTo(false)), // Automatically stop after 10 seconds
)
.pipe(
exhaustMap(
v => {
if (v && !shouldSkipFalsy) {
shouldSkipFalsy = true;
/**
* Spinner in action
* Also ignore any falsy values for 500ms
*/
return timer(500).pipe(mapTo(null), startWith(v), tap(() => shouldSkipFalsy = false))
}
return of(v);
}
),
filter(v => v !== null),
)
.subscribe(console.log)
С помощью exhaustMap
, что является своего рода противоположностью switchMap
, мне удалосьигнорировать любые ложные значения в течение определенного периода времени.
Что бы это сделать, это игнорировать любые последующие значения до тех пор, пока текущая внутренняя подписка не завершит завершение .
StackBlitz .