【问题标题】:Rxjs subject switch map to call another observableRxjs 主题切换映射来调用另一个 observable
【发布时间】:2022-01-08 18:17:29
【问题描述】:

我正在尝试对主题中每个发出的值调用另一个可观察对象。

我现在的问题是subject 的第一个发射值触发switchMap 并调用confirmCsvUpload(...),但每个下一个发射值都会触发switchMap 而不是confirmCsvUpload(...)

有人能弄清楚它为什么不调用该函数吗?

// Subject
private _confirmCsvUpload = new Subject<{ account: Account, previewData: PreviewData[], previewId: string }>();

// Subscription to the Subject 
this._confirmCsvUpload.pipe(
  switchMap(previewData => this._uploadCsvService.confirmCsvUpload(previewData.account, previewData.previewData, previewData.previewId))
).subscribe();

// Function which emits value to the subject (Not the function who gets called in the switchMap())
confirmCsvUpload(): void {
  this._confirmCsvUpload.next({ account: this.account, previewData: this._previewData, previewId: this.getPreviewIdFromRoute() });
}

【问题讨论】:

  • 分享完整代码
  • this._uploadCsvService.confirmCsvUpload(previewData.account, previewData.previewData, previewData.previewId) 本身是可观察的吗?
  • @Benny 它是一个返回 observable 的函数
  • @zainhassan 你需要什么代码?我认为this._uploadCsvService.confirmCsvUpload(...) 无关紧要
  • @MarcelSauter 好的,这很好。在这种情况下,我建议在 Stackblitz 上分享一个演示问题的最小应用程序

标签: javascript angular typescript rxjs


【解决方案1】:

我尝试用以下方式重播你的场景:

  private _confirm$ = new Subject();
  private _destroy$ = new Subject();
  ngOnInit() {
    this._confirm$
      .pipe(
        takeUntil(this._destroy$),
        tap((v) => console.log('[SUB]', v)),
        switchMap((v: any) => this.secondCall())
      )
      .subscribe();
  }

  secondCall() {
    console.log('[SECOND CALL]');
    return of();
  }

  callSub() {
    console.log('[NEXT VALUE]');
    this._confirm$.next('value');
  }

  ngOnDestroy() {
    this._destroy$.next(null);
    this._destroy$.complete();
    console.log('[NG ON DESTROY]');
  }

带有 2 个调用的控制台日志:

[NEXT VALUE]
[SUB] value
[SECOND CALL]

--第二次:

[NEXT VALUE]
[SUB] value
[SECOND CALL]

【讨论】:

  • 感谢您的回复。我认为我的问题是返回 observable 的服务函数,但是在您的示例中,我排除了我的问题是 switchMap。
猜你喜欢
  • 2018-03-05
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2020-07-21
  • 2019-01-23
  • 2021-06-30
相关资源
最近更新 更多