Calling/Subscribing 到一个带参数的函数,returns 一个可观察的

Calling/Subscribing to a function with parameters, that returns an observable

这和我问的有点关系。该问题中的 feature$ 函数 returns 具有使用传递给函数的参数的映射的可观察对象:

 feature$ = (feature: string): Observable<FeatureConfig | null> => {
    return this.features$.pipe(
      map((features: FeatureConfig[]) => {
        return (
          features.find((featureConfig: FeatureConfig) => {
            return featureConfig.key === feature;
          })?.value ?? null
        );
      })
    );
  };

然后在其他地方这样使用:

this.featureService
  .feature$("featureName")
  .subscribe((featureConfig: FeatureConfig) => {
    ...
  });

或者:

someFeature$ = this.featureService.feature$("featureName");

features$ observable 是(我认为,根据定义)一个热的 observable,因为它的值可以在 observable 的整个生命周期中发生变化并且它永远不会完成。虽然这似乎可以达到预期目的,但我只是想知道当有很多订阅者使用该 feature$ 函数时这会产生什么影响。我担心可能会有一些我没有立即注意到的意外行为。

这通常是一个不好的模式吗?如果是这样,是否有更好的模式来做类似的事情?也就是说,订阅使用传递给函数的参数创建的可观察对象。

例如,喜欢这样的东西吗?

  feature$ = (featureName: string): Observable<FeatureConfig | null> => {
    return of(featureName).pipe(
      mergeMap((feature: string) => combineLatest([of(feature), this.features$])),
      map(([feature, features]: [string, FeatureConfig[]]) => {
        return (
          features.find((featureConfig: FeatureConfig) => {
            return featureConfig.key === feature;
          })?.value ?? null
        );
      })
    );
  };

或者这重要吗?

第二个流示例有点过于复杂,您的 features$$ 是一个行为主题,可能会不断自我更新。你的意图只是通过特征数组接收参数并处理并输出找到的特征,代码的第一种形式更合适。

由于源流是 BehaviorSubject 一旦订阅 (),您将始终有一个值,只是不要忘记取消订阅 () 以防止内存泄漏。或者在 subscribe()

之前使用 take(1)first() 运算符

当您从函数创建一个可观察对象时,您会得到该流的一个新实例,它是一个热可观察对象但不是 shared(),因此 'featureA' 上的过滤不会影响过滤结果在 'featureB' 上,是的 of()combineLatest() 在您的用例中确实没有任何作用,因为它们是静态且未更改的函数参数