Угловой 2, throttleTime на заметное от субъекта - PullRequest
2 голосов
/ 04 ноября 2019

Я пытаюсь заставить эффект throttleTime вступить в силу, но по какой-то причине он не срабатывает. У меня есть следующее:

// Class Properties    
private calendarPeriodSubject: Subject<x> = new Subject<x>();
private calendarPeriodObservable$ = this.calendarPeriodSubject.asObservable();


// Throttling fails here (Inside constructor):
const calendarPeriodSubscription = this.calendarPeriodObservable$.pipe(throttleTime(750)).subscribe(async (calendar: x) => {
    // Do http stuff here
  }
});

Тема вызывается так:

this.calendarPeriodSubject.next(x);

Я также пытался:

this.calendarPeriodSubject.pipe(throttleTime(1000)).subscribe({next: (x) => x});

Я хотел бы обработать ПЕРВЫЙ раз, и следующие клики не должны иметь никакого эффекта до истечения, например, 750 мс - чтобы предотвратить спам на сервере в основном.

У кого-нибудь есть идеи?

Спасибо!

1 Ответ

0 голосов
/ 05 ноября 2019

Проблема в том, что вы используете неправильный оператор для вашего варианта использования. Насколько я понимаю ваше объяснение, которое вы хотите отправить через первый звонок, и прекратите любые дальнейшие звонки на ваш Сервер на некоторое количество мс. Но throttleTime(sec) просто устанавливает таймер на действие и выполняет его sec мс позже. Таким образом, ваш сервер все еще будет рассылаться спамом, всего через несколько мс.

Ваш случай кричит для меня debounceTime(). debounceTime document

Это позволяет обрабатывать любые дальнейшие данные, которые будут передаваться через Observable в течение указанного времени после выдачи значения.

Поэтому ваш код должен быть в порядке, если выиспользуйте что-то вроде:

const calendarPeriodSubscription = 
this.calendarPeriodObservable$.pipe(debounceTime(750)).subscribe((calendar: x) => {
    // Stuff with returned data
});    
...