【发布时间】:2020-09-26 23:44:07
【问题描述】:
我想在数据进入时显示分析的部分结果。为每个新值重新计算效率非常低(与“扫描”一样)。但是,在这种情况下,我可以对数据块进行分析并结合这些结果。所以我一直在使用“窗口”来分解数据,然后“扫描”来组合每个窗口计算的结果。结果本身就是一个可观察对象,因此将其作为嵌套的可观察对象发出是很自然的。此外,在使用 observables 时,该过程的下一步非常有效。
但是,我无法按预期工作。 (我确实做了一个尴尬的步骤,将内部可观察对象转换为数组,然后再转换为可观察对象。)似乎我对“窗口”和/或“扫描”有些不理解。
这里有两个示例,它们在生成嵌套 observable 的方式上有所不同。我原以为以下两个示例会给出相同的结果,但事实并非如此。
首先,我直接创建嵌套的 observable。第二,我用窗口操作创建它。然后,在这两种情况下,我都会对嵌套的 observable 应用相同的扫描。
这符合我的预期:
rxjs.from([rxjs.from([1, 2]), rxjs.from([3, 4])])
.pipe(
ops.scan((acc, curr) => rxjs.merge(acc, curr), rxjs.from([]))
).subscribe(win => win.subscribe(
x => console.log(JSON.stringify(x)), e => console.log("error"), () => console.log("|")),
e => console.log("outer error"), () => console.log("outer |"))
对于每个发出的 observable,我看到了前一个值的累积,然后是新的值。
1 2 | 1 2 3 4 |
我预计下一个会产生相同的结果,但事实并非如此:
rxjs.from([1, 2, 3, 4])
.pipe(
ops.windowCount(2),
ops.scan((acc, curr) => rxjs.merge(acc, curr), rxjs.from([]))
).subscribe(win => win.subscribe(x => console.log(JSON.stringify(x)), e => console.log("error"), () => console.log("|")),
e => console.log("outer error"), () => console.log("outer|"))
它似乎有效地忽略了扫描操作并发出原始窗口,
1 2 | 3 4 |
我错过了什么?对此的传统解决方案是什么样的?谢谢!
【问题讨论】:
标签: rxjs rxjs-pipeable-operators