RxJS扫描以使用过滤器和偏移量作为url参数来累积数据库结果

时间:2019-10-17 09:13:43

标签: rxjs rxjs-observables

我有两个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运算符?或扫描之前可以使用的其他一些运算符?

2 个答案:

答案 0 :(得分:0)

没有什么可以阻止您进行一次抽象级别的提升,并处理所谓的“高阶可观察物”(Observable<Observable<T>>类型的那些)。另外文档指出:

  

请注意,直到每个时,combinateLatest才会发出初始值   可观察发出至少一个值。这与以下行为相同   withLatestFrom,可能是一个陷阱,因为将没有输出,也没有   错误,但您的一个或多个内部可观测值可能不会   不能正常运行,或者订阅已晚。

如果您觉得我的回答与您的问题无关,那么请提供更多详细信息,我会自我更新。


不,scan可能不是这里的原因。 combineLatest是。首先,同时过滤和滚动调用next时看不到它;其中之一甚至可以complete,如果是这种情况,那么就到这里。其次,scanreduce,具有额外的功能:next不仅减少的最终结果,而且还有中间结果,仅此而已。最后但并非最不重要的一点,您可能决定在整个管道中插入tap(console.log)(或依靠debugger)来快速检查正在发生的事情。

答案 1 :(得分:0)

找到问题所在。 它既不在combineLatest中也不在scan
filtering之后,我要做的就是将offset的可观察值重置回null,以便它可以从列表中的已过滤项目中获得新的offset