基于终止属性提取子流

时间:2014-11-24 21:01:09

标签: javascript bacon.js

我有一个流,其中事件看起来像这样:

{ 
  endOfSequence : false,
  sequenceId: 12345,
  data: [.....]
}

我需要在endOfSequence === true时终止序列。我从takeWhile开始:

seq = stream.takeWhile( function(event){
    return !event.endOfSeq;
});

但问题是我错过了最后一次活动。

我显然可以编写完成同样事情的代码,例如:

function beforeEnd(event){
    return !event.endOfSeq;
}
seq = stream.takeWhile(beforeEnd)
            .merge(stream.skipWhile(beforeEnd).take(1));

但这有点难看。还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您可以编写一个Bacon.withHandler的自定义处理程序,当您获得Bacon.End()时会发出endOfSequence

seq.withHandler(function(event) {
    var ret = this.push(event)
    if(event.hasValue() && event.value().endOfSequence) {
       ret = this.push(new Bacon.End()) 
    }
    return ret
})

可在此jsFiddle中找到一个工作示例。

答案 1 :(得分:1)

适用于 baconjs v3 的已接受答案:

takeUntilLastEventSatisfies = (predicate, observable) =>
    observable.transform(
        (baconEvent, sink) => {
            if (!Bacon.hasValue(baconEvent)) {// error or end
                return sink(baconEvent);
            }
                
            if (predicate(baconEvent.value)) {
                sink(baconEvent);
                return sink(new Bacon.End());
            }
                
            return sink(baconEvent);
        })
    );