【发布时间】:2020-06-17 17:15:30
【问题描述】:
我有一个BehaviourSubject,它通过Service 的构造函数中的getSaveBehaviorSubject() 订阅。此行为主体可以从其他组件/服务接收多种类型的数据,其中某些类型需要存储在后端,而其他人则没有。当它接收到需要存储的值时,它会通过put/post 请求将其发送到后端。作为请求速率限制器,我使用 debounce(300) 运算符,以便在 300 毫秒不活动之后向服务器发出实际请求。这将防止服务器抛出429 Too many requests 错误。仅当推送需要存储的值类型时才应应用 debounce 运算符。我尝试使用 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 运算符的管道的可观察对象。否则它应该只返回一个具有原始值的新 observable。
当iif 条件为真时,debounceTime 似乎不起作用。无论我是否登录或是否应该保存数据类型,它总是会立即发送请求。显然我做错了什么。
谁能告诉我将 iif 运算符与 debounceTime 运算符结合使用的正确方法是什么?谢谢
【问题讨论】: