我有一个流,其中事件看起来像这样:
{
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));
但这有点难看。还有更好的方法吗?
答案 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);
})
);