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