我有两个behaviorSubjects
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
)
页面加载后,我从数据库中获得10条记录,在onScroll中,我获得了10条记录和10条..这就是 mergeMap 和 scan 所负责的(按预期方式) )。
onFilter所有现有的记录都消失了(按预期方式),我从DB中获得了10条新的过滤记录,现在当我滚动时,我没有得到更多的记录,而是将它们保存在DB中。
据我所知问题出在..在扫描运算符
中是否有if运算符?或扫描之前可以使用的其他一些运算符?
答案 0 :(得分:0)
没有什么可以阻止您进行一次抽象级别的提升,并处理所谓的“高阶可观察物”(Observable<Observable<T>>
类型的那些)。另外文档指出:
请注意,直到每个时,combinateLatest才会发出初始值 可观察发出至少一个值。这与以下行为相同 withLatestFrom,可能是一个陷阱,因为将没有输出,也没有 错误,但您的一个或多个内部可观测值可能不会 不能正常运行,或者订阅已晚。
如果您觉得我的回答与您的问题无关,那么请提供更多详细信息,我会自我更新。
不,scan
可能不是这里的原因。 combineLatest
是。首先,同时过滤和滚动调用next
时看不到它;其中之一甚至可以complete
,如果是这种情况,那么就到这里。其次,scan
是reduce
,具有额外的功能:next
不仅减少的最终结果,而且还有中间结果,仅此而已。最后但并非最不重要的一点,您可能决定在整个管道中插入tap(console.log)
(或依靠debugger
)来快速检查正在发生的事情。
答案 1 :(得分:0)
找到问题所在。
它既不在combineLatest
中也不在scan
中
在filtering
之后,我要做的就是将offset
的可观察值重置回null
,以便它可以从列表中的已过滤项目中获得新的offset
。