我在组件中使用了这两种类型的 observables,这就是我的原因
(可能还有其他我不知道的):
使用订阅 observable 的原因:
- 手动控制订阅和取消订阅。
- 在内部使用之前同步组件内数据的加载和操作。
- 当订阅的数据在组件内部(非可视化)使用时,例如服务或计算。
使用异步可观察管道的原因:
- 订阅和取消订阅 observables 是自动处理的。
- 在 HTML 模板中使用之前同步组件内数据的加载和操作。
- 如果有许多 HTML 元素依赖于订阅的数据,并且您希望在组件销毁后自动释放订阅。
在这两种情况下,您都可以在使用前在组件中加载和操作订阅的数据。
每个示例如下:
基于订阅
TS
someData: SomeClass[] = [
{ id: 1, desc: 'One', data: 100 },
{ id: 2, desc: 'Two', data: 200 },
{ id: 3, desc: 'Three', data: 300 }
];
someData$: Observable<SomeClass[]>;
this.someData$ = of(this.someData).subscribe((res) => {
this.someData = res.map((r) => {
r.data = Math.floor(r.data * 1.1);
return r;
});
});
异步可观察管道
TS
...
someData: SomeClass[] = [];
someData$: Subscription;
this.someData$ = of(this.someData).pipe(
map((res) => {
res.map((r) => {
r.data = Math.floor(r.data * 1.1);
});
return res;
})
);
HTML(两个选项)
<li *ngFor="let data of someData$ | async">
Item={{ data.desc }}. Value={{ data.data }}
</li>
总而言之,任一选项的使用取决于组件的复杂性、类型(可视或非可视)以及您希望如何管理订阅的内存管理。
原问题的答案是否定的,在涉及计算/预处理时手动订阅不一定更好。你也可以使用异步管道来做同样的事情,就像我在上面两个等效示例中展示的那样。