rxjs - 按可观察属性的值过滤可观察数组?
问题描述
我有一个符合以下条件的排放流:Observable<Notice[]>
. 每个Notice
都有一个属性isVisible$
( Observable<boolean>
),它决定了它是否在这个特定的时刻出现在屏幕上。我想通过最近的值是否是来过滤这组isVisible$
通知true
。当出现新array
的通知时,我想再次开始该过程。我知道这需要switchMap
在更高阶的可观察流上使用。
两种类型的 observable 都不会完成,因此使用 like 运算符toArray()
在这里不起作用。每个isVisible$
流都保证至少发出一次。
我希望输出也是 of Observable<Notice[]>
,每次isVisible$
任何内部可观察谓词的流更新时都会发出。
到目前为止,我确实发出了正确的值,但内部管道只是将通知组合在一起并发出它们(通过scan
,代替toArray
),它不会缓冲到 的长度from(notices)
然后发出(如果这有意义的话)。这使得流的最终结果是太忙了。
notices.pipe(
switchMap(notices => from(notices).pipe(
mergeMap(notice => notice.isVisible$.pipe(
map(isVisible => ({ notice, isVisible }))
)),
filter(({ isVisible }) => isVisible),
map(({ notice }) => notice),
scan((noticesArr, noticeBeingAddedOrRemoved) => {
if (!noticesArr.find(n => n.identifier === noticeBeingAddedOrRemoved.id)) {
noticesArr.push(noticeBeingAddedOrRemoved);
}
return noticesArr;
}, [])
))
);
解决方案
我已将其更改为使用 zip,它只会在每个 isVisible$ observables 发出时才会发出。combineLatest
如果您想在任何源 observables 发出时发出,也可以使用,而不是等待所有这些。
推荐阅读
- javascript - 如何从 mongodb 聚合中获取值
- javascript - 如何使用 jsPDF 和 canvas 生成 PDF?
- java - 如何在 IntelliJ IDEA 中将 AwesomeFontFX 图标包添加到 JavaFX 项目?
- python - 如何加快相机捕获并使用 Python 套接字通过 Mesh 网络发送的图像的传输速率
- ios - NativeScript - iOS - 获取/列出用户共享照片库中的所有照片
- ssh - ssh 隧道上的 SCP
- excel - 如何为单元格赋值?
- python - 计算当前下载速度的逻辑
- php - 尝试订阅“Google 我的商家”帐户以接收通知时出现异常
- networking - localhost 代理如何工作以及它与“普通/服务器代理”有何不同