这在某种程度上与我之前问的一个问题有关。该问题中的功能$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()
在你的用例中真的没有任何作用,因为它们是静态的和不变的函数参数