使用条件 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];

  ...
});

如果它们的结果相互依赖,您可以使用 switchMapflatMapmergeMapexhaustMap(检查差异)

let resultObservable =  return this.observable1().pipe(mergeMap((param1) => {
  return this.observable2().pipe(map((param1) => {

    ....        

    return <result>;
  }));
}));

resultObservable.subscribe(x => {
   ...
});

filtermergeMap/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
  });