我正在寻找一种利用RxJS 5处理任意时间触发的请求并仅发出最新结果的方法。
我正在尝试使用Subject
和switchMap
解决此问题。理想情况下,我想观察字符串值(URL)并发出响应。如果在收到任何先前的响应之前观察到新的url,则应将其忘记(或取消-我相信这个实际上是在switchMap
中实现的。)
我设法产生了以下代码:
const stream$ = new Rx.Subject()
.switchMap(url => Rx.Observable.fromPromise(
fetch(url).then(res => res.json())
))
.subscribe(res => console.log(res));
stream$.next('https://some-api-server.com/1');
stream$.next('https://some-api-server.com/2');
stream$.next('https://some-api-server.com/3');
根据我对switchMap
的了解,控制台输出应仅显示上次请求的结果。相反,它显示了我传递给stream$
的网址。我怎么了?
答案 0 :(得分:3)
您的代码可以按以下方式重写:
const subject = new Rx.Subject();
const stream$ = subject
.switchMap(url => Rx.Observable.fromPromise(
fetch(url).then(res => res.json())
));
const subscription = stream$.subscribe(res => console.log(res));
subscription.next('https://some-api-server.com/1');
subscription.next('https://some-api-server.com/2');
subscription.next('https://some-api-server.com/3');
而且,正如您所看到的,您正在将URL推送到订阅中,而不是主题中…不知道为什么要使用next
方法,也许是实现细节。
要使其正常运行-将网址推入subject
变量