RXJS - 多次触发订阅。具有多个 if else 条件的嵌套订阅
RXJS - subscription trigger multiple times. Nested Subscription with multiple if else conditions
想优化以下代码:
多个 if else 语句中的多个订阅。
考虑:-
getList(): void {
this.subs.sink = this.subscription1.subscribe((user) => {
if (user) {
this.method1();
}
});
}
method1() {
//code
//code
if (condition){
//code
} else {
this.method2()
}
method2(){
this.subs.sink = this.subscription2.subscribe(
(response) => {
if(){
//code
} else {
this.method3();
}
}
method3(){
this.subs.sink = this.subcription3.subscribe(
(response) => {
//code
}
}
这导致触发多重订阅。
任何帮助。赞赏。
有多种方法可以简化多重订阅。这取决于 // code
究竟代表什么。如果大多数 // code
相同,那么您可以使用 filter
来应用条件。
以下方法假定每个 // code
块都是唯一的。它使用 switchMap
从一个 observable 映射到另一个。如果您不希望将可观察对象转发到订阅的 next
块,您可以 return RxJS EMPTY
常量。它基本上会完成可观察的。
import { EMPTY } from 'rxjs';
import { switchMap } from 'rxjs/operators';
getList(): void {
this.subs.sink = this.subscription1.pipe(
switchMap((user: any) => {
// code
if (condition) {
// code
return EMPTY;
}
return this.subscription2;
}),
switchMap((response: any) => {
if (condition) {
// code
return EMPTY;
}
return this.subscription3;
})
).subscribe({
next: (response: any) => {
// response from `this.subscription3`
// code
},
error: (error: any) => {
// handle error
}
});
}
想优化以下代码: 多个 if else 语句中的多个订阅。
考虑:-
getList(): void {
this.subs.sink = this.subscription1.subscribe((user) => {
if (user) {
this.method1();
}
});
}
method1() {
//code
//code
if (condition){
//code
} else {
this.method2()
}
method2(){
this.subs.sink = this.subscription2.subscribe(
(response) => {
if(){
//code
} else {
this.method3();
}
}
method3(){
this.subs.sink = this.subcription3.subscribe(
(response) => {
//code
}
}
这导致触发多重订阅。
任何帮助。赞赏。
有多种方法可以简化多重订阅。这取决于 // code
究竟代表什么。如果大多数 // code
相同,那么您可以使用 filter
来应用条件。
以下方法假定每个 // code
块都是唯一的。它使用 switchMap
从一个 observable 映射到另一个。如果您不希望将可观察对象转发到订阅的 next
块,您可以 return RxJS EMPTY
常量。它基本上会完成可观察的。
import { EMPTY } from 'rxjs';
import { switchMap } from 'rxjs/operators';
getList(): void {
this.subs.sink = this.subscription1.pipe(
switchMap((user: any) => {
// code
if (condition) {
// code
return EMPTY;
}
return this.subscription2;
}),
switchMap((response: any) => {
if (condition) {
// code
return EMPTY;
}
return this.subscription3;
})
).subscribe({
next: (response: any) => {
// response from `this.subscription3`
// code
},
error: (error: any) => {
// handle error
}
});
}