如何让withLatestFrom()与自己一起工作?

时间:2017-09-13 08:29:38

标签: javascript rxjs

我有中间流绑定到,但也可以从其他来源(如用户输入)触发事件。在我的程序的其他地方,我有派生流,需要将中间的新冲量与的最后一个值进行比较,所以全部归结为这样的代码:



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;
&#13;
&#13;

问题是&#34;派生&#34; 讯息永远不会打印(忽略来源中的第一个事件)。如何为来自中间流的每条消息创建一些流,获取的最后一个值,即使它当前是源的传播

1 个答案:

答案 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();
})();