Angular 了解嵌套可观察对象的行为

Angular 了解嵌套可观察对象的行为,angular,observable,Angular,Observable,我正在开发angular 7应用程序,我知道嵌套订阅函数是一种反模式,但正确使用了诸如mergeMap、switchMap等转换运算符。。。在管道函数中,我总是可以避免它。 我面临着一种无法理解内在可观察物是如何工作的情况。我有一种形式的过滤器,在一个被观察者发出信号的事件发生后完全初始化,在这个事件发生后,我必须通过formGroup上的.valueChanges来监听表单更改,格式化过滤器,最后过滤结果 this.filters.categoriesReady.asObservable()

我正在开发angular 7应用程序,我知道嵌套订阅函数是一种反模式,但正确使用了诸如mergeMap、switchMap等转换运算符。。。在管道函数中,我总是可以避免它。 我面临着一种无法理解内在可观察物是如何工作的情况。我有一种形式的过滤器,在一个被观察者发出信号的事件发生后完全初始化,在这个事件发生后,我必须通过formGroup上的.valueChanges来监听表单更改,格式化过滤器,最后过滤结果

this.filters.categoriesReady.asObservable()
      .pipe(
        tap((categories) => {
          this._createControlsCategories(categories);
          this.categories = categories;
          console.log('higher order observable');
        }),
        switchMap(() => this.filterForm.valueChanges),
        switchMap(filtersRaw => this._formatFilters(filtersRaw)),
        takeUntil(this.unsubscribe)
      )
      .subscribe(
        filtersFormatted => {
          this.filterResults(filterFormatted);
          this.filterUpdated.emit(true);
        }
      );
我认为内部流this.filterForm.valueChanges不会工作,因为它依赖于事件this.filters.categoriesReady,该事件只触发一次,实际上console.log打印一次,因此我认为它并不总是像我所希望的那样侦听。相反,每次应用于过滤器的更改都会执行subscribe函数中的代码。 有人能给我解释一下吗?

switchMap在外部可见光发射后切换到一个新的内部可见光,因此外部可见光只需要发射一次。不过,switchMap的行为是,每当外部可观察物发射时,它就会取消并重新订阅内部可观察物

TBH,在这种情况下,您似乎只是使用外部可观察对象来保证内部可观察对象在categoriesReady observable发出之前不会被订阅。我不确定这背后的原因是什么,当你不能单独订阅这两个,因为它们似乎并不相互依赖,我也不确定为什么_formatFilters返回一个可观察的


但希望通过执行switchMap清除switchMap行为

,您实际订阅了observable,并且每次都会收到通知。这并不是说它会在第一次发射后取消订阅。如果您只想从特定的observable中获取最新的值,请尝试使用withLatestFrom。我建议您阅读文档,因为它可能不是您希望它做的事情。switchMap的工作原理如下:假设您只对最新的JS趋势感兴趣。每次一个新的JS框架发布时,你都想忘掉之前的所有框架,成为最新流行框架的专家。所以你订阅了新的JS框架,当一个新的框架发布时,你会收到通知。每次有人出去,你都会退订关于旧框架的博客,然后订阅关于最新框架的博客。因此,在您的情况下,每次categoriesReady发出时,您都订阅表单发出的所有更改。您得到了bryan的观点,我使用outter observable通知已成功从远程获取类别,并能够创建和注册反应式表单控件。我可以独立订阅此.filterperform.valueChanges并仍能正常工作,但我想在注册类别控件时阻止valueChanges发出。我可能会使用CombineTest或withLatestFrom来完成这一点,并且仍然保持单独的流。我将尝试使用它,我理解您在注册时的意思说我switchMap在outter observable发出后切换到一个新的内部observable,所以outter只需要发出一次,但最后一个switchMap不是.valueChanges,而是它的流。\u formatFiltersfiltersRaw出于这个原因,我不认为.valueChanges还在监听。提前谢谢你,我希望我解释了我自己所有的内在观察仍然在听。他们只是在新值发出后取消并重新订阅