【发布时间】:2021-07-13 12:42:05
【问题描述】:
我有一个可观察的:
const allItems$: Observable
Items[] 类似于:[false, false, true, false]
我想要的是将 allItems 拆分为两个 Observable:`trueItems$ 和 falseItems$ 我目前正在做的是:
const allItems$: Observable<Items[]> = getAllItems();
const trueItems$ = allItems$.pipe(map(items => items.filter(item => !!item)));
const falseItems$ = allItems$.pipe(map(items => items.filter(item => !item)));
注意:我使用角度 | async 在视图中显示 observables。
它工作正常,但问题是 allItems observable 被调用了两次(如果我在 getAllItems() 函数中执行console.log('hello'),我将在控制台中有 2 个“hello”。
是否有可能做到更清洁并将“allItems$”一分为二,控制台中只有一个“hello”?
【问题讨论】:
-
您所描述的似乎比看起来更棘手。如果您将日志放在
getAllItems()中并且您看到两个日志,那么问题不在于这里的 RxJS,因为 RxJS 将对allItems$进行两次订阅,但它不能为您调用getAllItems()。所以看起来这段代码在你的应用程序中确实被调用了两次。仅当您返回延迟的 Observable 并且console.log在其回调中时,它才会生成两个日志,但由于您没有提及它,我想您没有提及。 -
我相信我有 2 个管道异步的事实就像有 2 个订阅导致双重日志记录。 @Philipp Meissner 给出的解决方案对我有用
-
您确实有两个订阅,但函数
getAllItems()仅被调用一次,因此如果您看到两条日志消息,则取决于返回的 Observable 的实现方式以及console.log的放置位置。
标签: javascript angular rxjs observable