rxjs - RxJS 扫描以使用过滤器和偏移量作为 url 参数来累积数据库结果
问题描述
我有两个行为主题
offset = new behaviorSubject<sring>(null)
filter = new behaviorSubject<string>(null)
我做以下..
combineLatest(
this.offset, // last item in the list, ID for example
this.filter // can be any string
).pipe(
mergeMap(([offset, filter]) => this.getChunkOfTen(offset, filter)),
scan((acc, chunkOfTen) => {
return { ...acc, ...chunkOfTen }
}, {}),
map(results => Object.values(results)) // to be able to loop on the frontend
)
当页面加载时,我从 DB 中获得 10 条记录,onScroll 我又获得了 10 条和 10 条……这就是mergeMap和scan负责的(如预期的那样)。
onFilter 所有现有记录都消失了(如预期的那样),我从数据库中获得了新的 10 条过滤记录,现在当我滚动时,我没有得到更多记录,我在数据库中有它们。
据我所知,问题出在......在扫描操作员中
是否有 if else 运算符?或者我可以在扫描之前使用的其他一些运算符?
解决方案
没有什么能阻止你攀登一个抽象级别并处理所谓的“高阶可观察对象”——那些类型Observable<Observable<T>>
...... 文档还指出:
请注意,在每个 observable 发出至少一个值之前, combineLatest 不会发出初始值。这与 withLatestFrom 的行为相同,并且可能是一个陷阱,因为没有输出也没有错误,但是您的一个(或多个)内部可观察对象可能无法按预期运行,或者订阅延迟。
如果您觉得我的回答与您的问题无关,请提供更多详细信息,我会自行更新。
不,scan
很可能不是这里的原因。combineLatest
是。首先,过滤和滚动调用时都看不到next
;他们中的一个甚至可能complete
,如果是这样的话,给你。其次,scan
具有reduce
额外的特点:它next
不仅是归约的最终结果,而且是中间结果,仅此而已。最后但并非最不重要的一点是,您可能会决定在整个管道上插入tap(console.log)
(或依赖debugger
)以快速检查正在发生的事情。
推荐阅读
- php - Symfony3.4 Deprecations: User Deprecated: Calling ... on template ..." from template .. 已弃用
- python - 多场景用户输入 Discord.py
- javascript - MomentJS 初学者日期验证失败
- python - 如何在机器人框架中获取这个 Json 元素的长度
- django - 通过 through 对多对多模型进行建模和查询
- python - 我需要python代码来获取python列表中一些k个连续数字的总和
- powershell - 使用 PowerShell 远程更改 Windows 产品密钥
- python - Pandas:是否可以对分类列进行下采样?
- javascript - 如何创建到期日提醒?
- maven - 从 jfrog artifcatory 下载工件时出现问题