У меня есть BehaviourSubject
, на который подписан через getSaveBehaviorSubject () в конструкторе Service
. Этот объект поведения может получать данные нескольких типов от других компонентов / служб, некоторые из которых должны храниться в бэкэнд, а другие нет. Когда он получает значение, которое необходимо сохранить, он отправляет его на серверную часть через запрос put/post
. В качестве ограничителя скорости запросов я использую оператор debounce(300)
, чтобы фактический запрос к серверу выполнялся после того, как прошло 300 мс бездействия. Это предотвратит выдачу сервером ошибки 429 Too many requests
. Оператор противодействия должен применяться только тогда, когда передается тип значения, который необходимо сохранить. Я пробовал создать такое условие с помощью оператора iif()
. Мой код выглядит так:
this.myService.getSaveBehaviorSubject()
.pipe(
tap(pair => {
if(this.dataStoreServiceJustInitialized){
this.dataStoreServiceJustInitialized = false;
return;
}
if (pair.length > 1){
this.updateDataTypeValue(pair);
localStorage.setItem(pair[0], JSON.stringify(pair[1]));
if(pair[0] === DataType.MEASURE_SYSTEM_PREFERENCE)
this.adjustSearchRadiusToChangedMeasureSystem();
}
}),
mergeMap(pair =>
iif(() => !!(this.loggedInSubject.value && this.dataTypeExclusionList.includes(pair[0])),
of(pair).pipe(debounceTime(2000)), of(pair)
)))
.subscribe(pair => {If (this.loggedInSubject.value) // make request to server...}
Мое решение основано на этом руководстве: https://www.learnrxjs.io/learn-rxjs/operators/conditional/iif, а интересующий код начинается с mergeMap
.
Если пользователь вошел в систему, и тип данных должен быть сохранен в базе данных (не содержится в dataTypeExclusionList
), тогда iif()
должен возвращать наблюдаемое с конвейером, содержащим оператор debounceTime
. В противном случае он должен просто вернуть новый наблюдаемый объект с исходным значением.
Когда условие iif
истинно, debounceTime, похоже, не работает. Независимо от того, вошел ли я в систему или нет, или если тип данных должен быть сохранен или нет, он всегда будет отправлять запрос немедленно. Ясно, что я делаю что-то не так.
Может ли кто-нибудь сказать мне, как правильно использовать оператор iif в сочетании с оператором debounceTime? Спасибо