javascript - 避免 RXJS 中的嵌套订阅
问题描述
我有以下代码:
someService.subscribeToChanges().subscribe(value => {
const newValue = someArray.find(val => val.id === value.id)
if (newValue) {
if (value.status === 'someStatus') {
someArray.findIndex((a) => a.id === value.id)
someArray.splice(index, 1);
} else {
newValue.status = value.status;
}
} else {
if (value.someProp === 'abc') {
someService.doSomeAsyncStuff().subscribe(data => {
someService.handleData(data);
});
}
}
});
我想保持相同的逻辑,同时避免第二次订阅。
这是我尝试过的代码
sub$ = someService.subscribeToChanges().pipe(switchMap(value => {
const newValue = someArray.find(val => val.id === value.id)
if (newValue) {
if (value.status === 'someStatus') {
someArray.findIndex((a) => a.id === value.id)
someArray.splice(index, 1);
} else {
newValue.status = value.status;
}
} else {
return iif(() => value.someProp === 'ABC', someService.doSomeAsyncStuff);
}
}));
sub$.subscribe(data => someService.handleData(data))
如果iif
条件为真,则此方法有效,但如果为假,它只会停止整个流,而我希望它继续流。
解决方案
您可以将它们分成三个条件
sub$ = someService.subscribeToChanges().pipe(switchMap(value => {
const newValue = someArray.find(val => val.id === value.id)
if (newValue) {
if (value.status === 'someStatus') {
someArray.findIndex((a) => a.id === value.id)
someArray.splice(index, 1);
} else {
newValue.status = value.status;
}
return of(value);
}
if(value.someProp === 'ABC')
return someService.doSomeStuff()
return of(value)
})
)
推荐阅读
- javascript - 我想在附近的地方搜索之前首先获得它的当前位置,并且可以选择在任何搜索之后或任何搜索之前
- react-router - 在 react-router 中切换应用程序
- reactjs - 如何解决“PropTypes”问题?
- powershell - 如何使用 Powershell 删除 CSV 标题并保持列分开
- google-cloud-platform - Google Cloud Run 在 Authorization 标头中屏蔽 Bearer 令牌
- jmeter - Jmeter Webdriver打开空浏览器
- python - 如何检查字符串是否为数字忽略非单词字符?
- assembly - 为什么我需要从 LDR 指令中的标签中减去 1?
- elasticsearch - Fluentd 无法使用 Elasticsearch 创建索引
- vue.js - 使用自定义表体实现选择 Vuetify 数据表的所有行