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()
在您的用例中确实没有任何作用,因为它们是静态且未更改的函数参数
这和我问的
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()
在您的用例中确实没有任何作用,因为它们是静态且未更改的函数参数