使用RxJS的switchMap限制请求

时间:2018-08-23 19:16:28

标签: javascript promise rxjs

我正在寻找一种利用RxJS 5处理任意时间触发的请求并仅发出最新结果的方法。

我正在尝试使用SubjectswitchMap解决此问题。理想情况下,我想观察字符串值(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$的网址。我怎么了?

1 个答案:

答案 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变量