如何最好地处理模板上可观察到的多个订阅?

代码_12

假设我有一个称为“ todoList $”的观察对象。使用“异步”运算符,我可以自动对其进行订阅/取消订阅。下面的代码中的问题是,同一可观察对象有两个相同的订阅:

<ng-container *ngIf="(todoList$ | async).length > 0>
  <div *ngFor="let todo of todoList$ | async">
    ...

这不是很干,因此,我们为可以更有效处理的预订分配内存。

由于ngIf条件中的语法,我不相信我可以使用'as'关键字为可观察的输出创建模板变量。相反,当我从组件文件中使用RxJs的“ share”运算符时,有效的方法是

todoList$ = this.store.select(todoList).pipe(tap(x => {console.log('testing')}), share());
//testing  

没有共享运算符,“测试”打印两次。这使我相信share()运算符可以解决此问题。如果确实如此,则不完全清楚为什么/如何做?由于这可能是普遍存在的问题/代码异味,因此处理同一模板中相同的多个订阅的最佳方法是什么?

我承认在StackOverflow上有一些类似的问题。但是没有人能给我确切的信息。

波尔·克鲁伊特

通常,我shareReplay({ refCount: true, bufferSize: 1 })Observable模板内部每个末尾使用运算符我还将其添加到基本可观察对象中,该基本可观察对象用于分支其他可观察对象,然后将其用于模板中。这将确保订阅在每个订阅者之间共享,并且通过使用,shareReplay您还可以使用在组件内部获取最后发出的结果take(1)

的原因{ refCount: true, bufferSize: 1 }是,如果仅使用shareReplay(1)它,则可能导致订阅泄漏,无论您是否使用async管道。

回到您的示例,提供的答案还Michael D不错,并且这样做是有意义的。但是,它确实需要模板中的一些逻辑,我个人对此并不满意。

因此,只要您使用shareReplayasync在模板中使用多个调用实际上就没有任何弊端,您甚至可以通过在组件中定义它们来使它们在整个模板中具有描述性和可重用性:

export class TodoComponent {
  readonly todoList$ = this.store.select(todoList).pipe(
    shareReplay({ refCount: true, bufferSize: 1 })
  );

  readonly hasTodos$ = this.todoList$.pipe(
    map((todos) => todos?.length > 0),
    shareReplay({ refCount: true, bufferSize: 1 })
  );
}

然后,您可以使模板保持描述性:

<ng-container *ngIf="hasTodos$ | async>
  <div *ngFor="let todo of todoList$ | async">
  <!-- -->

不要忘记你的trackBy


如果您不喜欢重复代码,甚至可以创建自定义运算符,然后使用它:

export function shareRef<T>() {
  return (source: Observable<T>) => source.pipe(
    shareReplay({ refCount: true, bufferSize: 1 })
  );
}

哪个将您的观察结果更改为:

readonly todoList$ = this.store.select(todoList).pipe(
  shareRef()
);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

淘汰赛可观察到多个订阅

如何处理可观察到的错误,但继续观察可观察到的东西?

如何取消订阅或处理Angular2或RxJS中可观察到的间隔?

Redux上可观察到的理想商店订阅

如何从订阅中返回可观察到的

最终可观察到订阅

如何处理axios httpservice可观察到的响应?

如何合并多个可观察到的RxJS的结果?

角度可观察到仅使用页面上的多个组件更新其父订阅者

如何枚举可观察到的同步?

可观察到的Redux:操作完成后组件如何订阅以做出反应?

rxjs何时可观察到的订阅同步执行?

删除可观察到的操作,因为订阅已取消

订阅Angular 8中可观察到组件的问题

可观察到的错误消息-无法捕获订阅

是否可以重新订阅可观察到的Retrofit 2?

如何使“独立”计算的可观察到的某些可观察到的(Knockout.js)

如何“绑定”(存储)可观察到的$ index到我的可观察到的?

可观察到可观察的顺序

可观察到的数据集未在模板中更新

从HTML模板调用异步功能(可观察到的Retunes)

我如何最好地处理从 const char * 到模板类型的转换

Mobx 和 React。可观察到的变化后如何处理焦点输入?

如何处理可能为空的rxjs可观察到的响应?

如何使用router.navigate处理4xx错误,可观察到。角度2

多个可观察的订阅

处理json响应可观察到的迅速

可观察到的Redux无法处理后端响应

如何嵌套多个可观察物/订阅