如何订阅有条件的订阅结果

how to subscribe in a conditional subscription result

我正在尝试执行 3 个异步操作(可观察对象),一个在另一个内。 1. 第一个可观察到的是模态对话框 eventEmiter 的响应——流程的其余部分取决于它的响应(假设模态 return 布尔发射器涉及:"Do you want to delete the item")。 2. 第二个observable是更新(删除)动作 3.第三个是删除后取回新数据

我正在使用 rxjs- 并尝试弄清楚如何在不订阅的情况下进行订阅。 查看我的代码:

subscriptions : Subscription[] = [];

openDeleteDialog(data : any)
{
    const modalRef : NgbModalRef = this.modalService.open(ConfirmationDialogComponent); //Modal  dialoge reference
    this.subscriptions.push(modalRef.componentInstance.passResult.subscribe( 
    (result =>//This is the response from the modal dialog
      {
        if (result)
        {
          let updateApi : UpdateApi = new UpdateApi(data);
          this.srv.updateData(updateApi).pipe( //This is the update operation
            tap(() =>
            { 
              this.srv.getData(); //This is the fetch data operation
            }
            )

          ).subscribe();
        }
      }
    )
    ));
} 

您可以使用 mergeMapiif 运算符;

const subscription = modalRef.componentInstance.passResult
  .pipe(mergeMap(result => iif(() => result, of(result))))
  .pipe(mergeMap((result) => {
    let updateApi : UpdateApi = new UpdateApi(data);
    return this.srv.updateData(updateApi);
  }))
  .pipe(tap(() => this.srv.getData()))
  .subscribe();
this.subscriptions.push(subscription);

您可以为此使用管道、过滤器和 switchMap:

subscriptions : Subscription[] = [];

openDeleteDialog(data : any)
{
  const modalRef : NgbModalRef = this.modalService.open(ConfirmationDialogComponent); //Modal  dialoge reference
  this.subscriptions.push(
    modalRef.componentInstance.passResult
     .pipe(
       filter((result) => !!result),
       switchMap((result) => {
          let updateApi : UpdateApi = new UpdateApi(data);
          return this.srv.updateData(updateApi);
       }),
       switchMap((updateResult) => this.srv.getData())
     ).subscribe((getDataResult) => console.log(getDataResult))
  );
}

首先你使用过滤器只在结果为某物时传递数据,然后你切换到一个新的可观察对象,更新数据可观察对象,同时你通过管道将那个对象切换到获取数据可观察对象。 这样你就可以链接可观察对象,我猜你需要等待更新数据结果才能再次获取数据。

编辑:附加信息,您正在使用 tap 调用 this.srv.getData(),但是如果那个 returns 是一个带有 http 请求的可观察对象,则永远不会调用该请求,因为您需要订阅它才能发出请求。作为一般规则,我将自来水管用于附带效果,它只需要可观察的结果,但不会修改与可观察相关的任何其他内容,如果有任何意义的话。

不要使用订阅数组,而是使用带有 takeUntil 的主题

finalised = new Subject<void>();

然后作为您的可观察链中的最后一个运算符进行拍摄

modalRef.componentInstance.passResult.pipe(
  filter(result => result)
  switchMap(_ => this.srv.updateData(new UpdateApi(data)),
  switchMap(_ => this.srv.getData()),
  takeUntil(this.finialised)
).subscribe(updatedDataAfterDelete => {
  // Do stuff with updated data
});

并且在你的 ngOnDestroy

this.finialised.next();
this.finialised.complete();

这样您就可以让一个主题完成所有订阅,而不是将它们推送到订阅数组中。