调用/订阅带有参数的函数,该函数返回可观察的值

  • 本文关键字:函数 返回 观察 参数 调用 rxjs
  • 更新时间 :
  • 英文 :


这在某种程度上与我之前问的一个问题有关。该问题中的功能$function返回一个带有映射的可观察值,该映射使用传递给函数的参数:

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");

特征$observable(我认为,根据定义(是一个热门的可观察对象,因为它的值可以在可观察对象的整个生命周期中发生变化,而且永远不会完成。虽然这似乎符合其预期目的,但我只是想知道,当有很多订阅者使用$功能时,这会产生什么影响。我担心可能会有一些我没有立即注意到的意外行为。

一般来说,这是一种糟糕的模式吗?如果是这样,有没有更好的模式来做类似的事情?也就是说,订阅通过传递给函数的参数创建的可观察对象。

例如,像这样的东西会更受欢迎吗?

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$$是一个可能不断更新自身的Behavior主题。您的意图是只接收参数并通过features数组处理并输出找到的feature,第一种形式的代码更合适。

由于源流是BehaviorSubject,所以一旦subscribe((,您总是会有一个值,只是不要忘记取消subscribe(以防止内存泄漏。或者在subscribe()之前使用take(1)first()运算符

当你从一个函数创建一个可观察对象时,你会得到该流的一个新实例,它是一个热可观察对象,但不是shared(),所以在"featureA"上过滤不会影响在"feature B"上过滤的结果,是的,of()combineLatest()在你的用例中真的没有任何作用,因为它们是静态的和不变的函数参数

最新更新