如何处理 RxJS 中循环依赖的可观察对象?

How to handle circularly dependent observables in RxJS?

比方说服务器上某处有一个映射 整数和名称以及网页提供了一个简单的输入,用户可以在其中 可以输入一个数字,并给出相应的名字。

这个问题的基本形式很简单:

const input$          = Rx.Observable.fromEvent(..., "input");
const request$        = input$.map( ... );
const serverResponse$ = request$.flatMap( askServer );

现在我想缓存结果,这样一个请求就可以了 当号码不在缓存中时完成。

const input$          = Rx.Observable.fromEvent(..., "input");
// request$ should now also depend on cache$
const request$        = ???;
const serverResponse$ = request$.flatMap( askServer );
const cache$          = serverResponse$.scan( ... );

但现在 request$ 依赖于 cache$,后者依赖于 serverResponse$ 这又取决于 request$.

如何解决这个问题?

在依赖图中的循环中的某个点引入一个Subject作为代理,然后将真实Observable(cache$)的行为镜像到代理Subject(proxyCache$).

const input$          = Rx.Observable.fromEvent(..., "input");
const proxyCache$     = new Rx.Subject();
const request$        = input$.merge(proxyCache$).map( ... );
const serverResponse$ = request$.flatMap( askServer );
const cache$          = serverResponse$.scan( ... );
cache$.subscribe(proxyCache$);