代码之家  ›  专栏  ›  技术社区  ›  Mukil Deepthi

Angular11 rxjs switchmap即使在外部可观测触发时也不工作

  •  0
  • Mukil Deepthi  · 技术社区  · 3 年前

    我正在尝试以下基本上需要触发每次过滤器得到改变。Cananyone请帮助我,使用高阶观测值有什么不对。

    工作版本:

    this.filterservice.registerFilters({
                    key: this.FILTERS_KEY,
                    filters: this.AUDIT_FILTERS,
                    sorts: [new DateSort({ for: 'modifiedOn' })]
                }).pipe(
                    takeUntil(this.destroy$)
                ).subscribe(filters => {
                    this.filters = filters;
                    this.auditBuilderListService.changeFilter(filters);
                    this.auditData$ = this.auditBuilderListService.auditBuilderData$;
                });
    

    使用switchmap(不工作):

    registerFilters$ = this.filterservice.registerFilters({
            key: this.FILTERS_KEY,
            filters: this.AUDIT_FILTERS,
            sorts: [new DateSort({ for: 'modifiedOn' })]
        });
    
        auditData$ = this.registerFilters$.pipe(
            switchMap((filters) => {
                this.filters = filters;
                this.auditBuilderListService.changeFilter(filters);
                return this.auditBuilderListService.auditBuilderData$;
            }),
            takeUntil(this.destroy$)
        );
    

    在职:

    auditBuilderData$ = combineLatest([
        this.pageNumberSubject,
        this.filterAction$
    ]).pipe(
        switchMap(([currentPage, filterParameters]) => {
            return this.getAudits(filterParameters, currentPage, this.pageSize);
        }),
        shareReplay(1)
    );
    

    不带开关映射的工作版本: auditData$:可观察的;

    registerFilters$ = this.filterservice.registerFilters({
        key: this.FILTERS_KEY,
        filters: this.AUDIT_FILTERS,
        sorts: [new DateSort({ for: 'modifiedOn' })]
    }).pipe(
        tap(filters => {
            this.auditBuilderListService.setPage(1);
            this.filters = filters;
            this.auditBuilderListService.changeFilter(filters);         
        }),
        takeUntil(this.destroy$)
    );
    
        this.registerFilters$
            .pipe(takeUntil(this.destroy$))
            .subscribe(filters => {
                this.auditData$ = this.auditBuilderListService.auditBuilderData$;
            });
    

    但有没有更好的方法来实现同样的目标?

    0 回复  |  直到 3 年前
        1
  •  0
  •   Joshua McCarthy    3 年前

    关于 auditBuilderListSerivce ,我假设 changeFilter() 结果 auditBuilderData$ 释放一个新的值。如果是这种情况,它解释了为什么你的开关地图不起作用。你回来了 auditBuilderData$ 太晚了,因为它在你调用的那一刻就释放出了它的价值 changeFilter() .

    至于解决方案,你可以选择 changeFilter() 返回要发出的值(如果可能)。另一个选择是引用和订阅 auditBuilderData$ 分别地

    registerFilters$ = this.filterservice.registerFilters({
      key: this.FILTERS_KEY,
      filters: this.AUDIT_FILTERS,
      sorts: [new DateSort({ for: 'modifiedOn' })],
    }).pipe(
      tap(filters =>{
        this.filters = filters;
        this.auditBuilderListService.changeFilter(filters);
      }),
      takeUntil(this.destroy$)
    );
    
    auditData$ = this.auditBuilderListService.auditBuilderData$;
      takeUntil(this.destroy$)
    );
    

    当你对这两个观测都有一个活跃的订阅, registerFilters$ 将调用 changeFilter() 作为副作用 auditData$ 释放它的新价值。

    推荐文章