我有中间流绑定到源,但也可以从其他来源(如用户输入)触发事件。在我的程序的其他地方,我有派生流,需要将中间的新冲量与源的最后一个值进行比较,所以全部归结为这样的代码:
const source = new Rx.Subject;
const derived = new Rx.Subject;
derived.subscribe( () => console.log( "derived" ) );
const intermediate = new Rx.Subject;
//motivation of having "intermediate" is that sometimes it fires on it's own:
source.subscribe( intermediate );
intermediate
.withLatestFrom( source )
.subscribe( derived );
source.next();

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.3/Rx.min.js"></script>
&#13;
问题是&#34;派生&#34; 讯息永远不会打印(忽略来源中的第一个事件)。如何为来自中间流的每条消息创建一些流,获取源的最后一个值,即使它当前是源>的传播
答案 0 :(得分:1)
如果我理解正确,您有一个source
信息流,然后是一个intermediate
信息流订阅并发出所有的source
个项目和混合信息在其他一些用户输入。然后你有两个不同的请求,我将分别提出建议:
从source
发出intermediate
的值{/ strong> combineLatest
可以轻松完成工作:
const source_when_intermediate : Observable<TSource> = intermediate.combineLatest(source, (i, s) => s);
将intermediate
的最新值与source
进行比较:虽然听起来非常相似,但combineLatest
不是很安全,因为如果你做的事情很简单像:
const is_different : Observable<bool> = intermediate.combineLatest(source, (i, s) => i !== s);
在intermediate
发出新值之前, source
可能无法从source
发出给定值,您可以认为该陈旧值对intermediate
是唯一的。
相反,为了最大限度地提高安全性,您需要缓冲并使用主题:
// untested
const derived : Observable<TSource> = (function() {
const source_buffer = new Queue();
const subj = new Subject();
source.forEach(s => {
source_buffer.enqueue(s);
});
intermediate.forEach(i => {
subj.onNext(source_queue.peek() === i);
if(source_buffer.peek() === i) source_buffer.dequeue();
});
Promise.all([
source.toPromise(),
intermediate.toPromise()
]).then(() => subj.onClose());
return subj.asObservable();
})();