我从一个事件构建一个observable,它输出文本行来确认被两个空行分隔的记录。例如:
xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
我希望observable将输出分成两行,这样订阅者就可以获得数据块。
如何使用RxJS完成此操作?它似乎没有执行这项工作的功能。
我可以订阅观察者,积累价值并重新发射自己,但我相信有一个更优雅的解决方案,我没有看到。
答案 0 :(得分:2)
buffer
和sample
以及scan
的组合也可以。基本上,您在缓冲区中累积输入(即行)。每当一个observable发出一个sample
的值时,你就会释放这个缓冲区。然后你创建它,以便每次检测到两个连续\n
时,observable都会发出一个值。这可以通过scan
来实现。请注意,这需要您的source$
成为热门观察者。
因此,您可以完成以下代码,并在最终有效时让我们更新:
var detect_two_lines = function (acc, new_line)){
// if new_line and last line of acc are both \n
// then acc.arr_lines = [], acc.found = true
// else acc.arr_lines.push(new_line), acc.found = false
}
var identity = function(x){return x}
var sample$ = source$.scan(detect_two_lines, {arr_lines:[], found:false})
.pluck('found')
.filter(identity);
var results$ = source$.buffer(sample$);