gpt4 book ai didi

angular - 如果我有 combineLatest,选择 ngrx 和 rxjs 有什么不同?

转载 作者:行者123 更新时间:2023-12-04 13:53:33 26 4
gpt4 key购买 nike

我有产品服务,我想从国家获得最好的产品。
我可以实现这一目标的一种方法是使用 rxjs像这样:

 @Injectable({ providedIn: 'root' })
export class ProductDataService extends EntityCollectionServiceBase<Product> {

bestProductsIds$ = new BehaviorSubject([]);

bestProducts$ = combineLatest([this.entities$, this.bestProductsIds$]).pipe(
map(([products, ids]) => products.filter((p) => ids.includes(p.id))),
map((products) => orderBy(product, ['createdDate', ['desc']])),
map((products) => this.toProductCard(products))
);
}
另一种方法是使用选择器:
export const selectBestProducts = createSelector(
([products, ids]) => products.filter((p) => ids.includes(p.id)),
(products) => orderBy(products, ['createdDate', ['desc']])
);


@Injectable({ providedIn: 'root' })
export class ProductDataService extends EntityCollectionServiceBase<Product> {

bestProductsIds$ = new BehaviorSubject([]);

bestProducts$ = combineLatest([this.entities$, this.bestProductsIds$]).pipe(select(selectBestProducts));

...
}
我知道 ngrx 选择器是内存功能,但我在这里使用 combineLatest .
那么在这种情况下两种方法有什么不同呢?或者是一样的?

最佳答案

简短的回答是没有区别,就像 combineLatest 的情况一样。您正在使用两个在引擎盖下具有内存值的选择器。
关于差异的详细回答,如果我们去 selector ngrx 内部的实现Docs我们可以看到 createSelector函数正在使用 defaultMemoize跟踪使用 isEqualCheck 的任何更改最后看起来是这样

export function isEqualCheck(a: any, b: any): boolean {
return a === b;
}
所以每当在 state 中提交更改(我们在选择器内部依赖的字段)相关选择器将计算它的新值。
您可以使用选择器做的有趣的事情是使用 createSeletorFactory您可以在其中提供自己的自定义比较功能,以便在需要时进一步优化。
关于 combineLatest与选择器一起使用,你有几乎相同的效果,一旦所有 observables 都发出了值,并且每次当新值从这些 observables 中的任何一个传递时,新值将在流的更远的地方发射,这将被你的逻辑处理(关于对 HitTest 门的项目进行细化的部分),这里使用 distincUntilChanged也可以达到同样的优化效果。运算符再次与您自己的自定义比较。
总之,两种方法的行为方式相同,唯一的区别在于,在第一种情况下,选择器正在执行所需的计算,而在第二种情况下,计算是在从 combineLatest 发出的流中处理的。可观察的。

关于angular - 如果我有 combineLatest,选择 ngrx 和 rxjs 有什么不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66599969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com