拆分RxJS可观察输出

时间:2016-06-28 18:36:23

标签: javascript rxjs

我从一个事件构建一个observable,它输出文本行来确认被两个空行分隔的记录。例如:

xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx


xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx


xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx

我希望observable将输出分成两行,这样订阅者就可以获得数据块。

如何使用RxJS完成此操作?它似乎没有执行这项工作的功能。

我可以订阅观察者,积累价值并重新发射自己,但我相信有一个更优雅的解决方案,我没有看到。

1 个答案:

答案 0 :(得分:2)

buffersample以及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$);