0

我有两个行为主题

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 条……这就是mergeMapscan负责的(如预期的那样)。

onFilter 所有现有记录都消失了(如预期的那样),我从数据库中获得了新的 10 条过滤记录,现在当我滚动时,我没有得到更多记录,我在数据库中有它们。

据我所知,问题出在......在扫描操作员中

是否有 if else 运算符?或者我可以在扫描之前使用的其他一些运算符?

4

2 回答 2

0

没有什么能阻止你攀登一个抽象级别并处理所谓的“高阶可观察对象”——那些类型Observable<Observable<T>>...... 文档还指出:

请注意,在每个 observable 发出至少一个值之前, combineLatest 不会发出初始值。这与 withLatestFrom 的行为相同,并且可能是一个陷阱,因为没有输出也没有错误,但是您的一个(或多个)内部可观察对象可能无法按预期运行,或者订阅延迟。

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


不,scan很可能不是这里的原因。combineLatest是。首先,过滤和滚动调用时都看不到next;他们中的一个甚至可能complete,如果是这样的话,给你。其次,scan具有reduce额外的特点:它next不仅是归约的最终结果,而且是中间结果,仅此而已。最后但并非最不重要的一点是,您可能会决定在整个管道上插入tap(console.log)(或依赖debugger)以快速检查正在发生的事情。

于 2019-10-17T11:15:29.443 回答
0

发现问题出在哪里..它不在, 我需要做的就是将 observable 重置combineLatest回它,以便它可以从列表中的过滤项目中获取新的。scan
filteringoffsetnulloffset

于 2019-10-19T12:43:11.870 回答