Javascript 基于终止属性提取子流

Javascript 基于终止属性提取子流,javascript,bacon.js,Javascript,Bacon.js,我有一个流,其中的事件如下所示: { endOfSequence : false, sequenceId: 12345, data: [.....] } 当endOfSequence===true时,我需要终止序列。我从takeWhile开始: seq = stream.takeWhile( function(event){ return !event.endOfSeq; }); 但问题是我错过了最后一场比赛 我显然可以编写完成相同任务的代码,例如: function

我有一个流,其中的事件如下所示:

{ 
  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));

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

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

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

下面是一个工作示例。

适用于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);
        })
    );