使用条件 rxjs6 重构嵌套订阅
Refactor nested subscribe with conditional rxjs6
我知道不推荐嵌套订阅,但我找不到任何关于重构它们的好资源。
这是我的代码:
this.checkExists(request.id).subscribe(exists => {
if (exists) {
this.getDeleteReason(request.id).subscribe(reason => {
if (reason) {
this.checkExists(request.id).subscribe(exists2 => {
if (exists2) {
// DO DELETE
}
});
}
});
}
});
我试过使用 mergeMap,但总是陷入困境。
有人能给我指出正确的方向吗?
如果是三个独立的tasks/observables,那就考虑用forkJoin
let observable1(param1);
let observable2(param2);
let observable3(param3);
let joinedObservables = forkJoin(observable1, observable2, observable3).subscribe(x => {
let result1 = x[0];
let result2 = x[1];
let result3 = x[2];
...
});
如果它们的结果相互依赖,您可以使用 switchMap
、flatMap
、mergeMap
、exhaustMap
(检查差异)
let resultObservable = return this.observable1().pipe(mergeMap((param1) => {
return this.observable2().pipe(map((param1) => {
....
return <result>;
}));
}));
resultObservable.subscribe(x => {
...
});
filter
和 mergeMap
/switchMap
的组合。
this.checkExists(request.id).pipe(
filter(exists => exists),
mergeMap(() => this.getDeleteReason(request.id)),
filter(reason => reason),
mergeMap(() => this.checkExists(request.id)),
filter(exist2 => exist2)
}).subscribe(() => {
//do delete
});
已编辑:
有多种方法可以将 reason
传递给订阅。在这种特殊情况下,我会在 exist2
.
旁边添加 reason
this.checkExists(request.id).pipe(
filter(exists => exists),
mergeMap(() => this.getDeleteReason(request.id)),
filter(reason => reason),
mergeMap(reason => ({
exist2: this.checkExists(request.id),
reason})),
filter(({exist2}) => exist2)
}).subscribe(({reason}) => {
//do delete
});
我知道不推荐嵌套订阅,但我找不到任何关于重构它们的好资源。
这是我的代码:
this.checkExists(request.id).subscribe(exists => {
if (exists) {
this.getDeleteReason(request.id).subscribe(reason => {
if (reason) {
this.checkExists(request.id).subscribe(exists2 => {
if (exists2) {
// DO DELETE
}
});
}
});
}
});
我试过使用 mergeMap,但总是陷入困境。
有人能给我指出正确的方向吗?
如果是三个独立的tasks/observables,那就考虑用forkJoin
let observable1(param1);
let observable2(param2);
let observable3(param3);
let joinedObservables = forkJoin(observable1, observable2, observable3).subscribe(x => {
let result1 = x[0];
let result2 = x[1];
let result3 = x[2];
...
});
如果它们的结果相互依赖,您可以使用 switchMap
、flatMap
、mergeMap
、exhaustMap
(检查差异)
let resultObservable = return this.observable1().pipe(mergeMap((param1) => {
return this.observable2().pipe(map((param1) => {
....
return <result>;
}));
}));
resultObservable.subscribe(x => {
...
});
filter
和 mergeMap
/switchMap
的组合。
this.checkExists(request.id).pipe(
filter(exists => exists),
mergeMap(() => this.getDeleteReason(request.id)),
filter(reason => reason),
mergeMap(() => this.checkExists(request.id)),
filter(exist2 => exist2)
}).subscribe(() => {
//do delete
});
已编辑:
有多种方法可以将 reason
传递给订阅。在这种特殊情况下,我会在 exist2
.
reason
this.checkExists(request.id).pipe(
filter(exists => exists),
mergeMap(() => this.getDeleteReason(request.id)),
filter(reason => reason),
mergeMap(reason => ({
exist2: this.checkExists(request.id),
reason})),
filter(({exist2}) => exist2)
}).subscribe(({reason}) => {
//do delete
});