可观察 - 制作动态请求队列(角度4)

时间:2017-10-16 20:16:11

标签: angular rxjs observable

我有一个关于可观察的问题。 例如,我们有api,并在那里发送一个请求:

this.http.get('https://swapi.co/api/people/').subscribe(peoplesData => {
   let peoples = peoplesData.json();
   let nextPage = peoples.next; // https://swapi.co/api/people/?page=2
   this.peoples = peoples.results;
});

当我发送第一个请求时,我会获得下一个请求的网址(在此示例中,网址包含在' nextPage')。 我需要创建一个方法,它将发出所有请求,并在每个请求之后添加所有结果'来自这个人民的#39; 我认为,.mergeMap和switchMap不适合它。 也许你对Observable有更多的考验?请帮我这个方法。

更新 我用.expand解决了这个问题:

return this.http.get('https://swapi.co/api/people/')
      .expand(peoplesData => {
        let peoples = peoplesData.json();
        if (peoples.next) {
          return this.http.get(peoples.next);
        } else {
          return Observable.empty();
        }
      })
      .map(peoples => peoples.json());

1 个答案:

答案 0 :(得分:0)

我的解决方案使用rxjs Rx flatMap:

import {Observable} from 'rxjs/Rx';


ngOnInit() {
  const arrayIds = [2456, 12456, 456, 7899];
  this.doUsersRequest(arrayIds);
}

doUsersRequest(queryArr, previousObservable = null) {
        if (queryArr.length) {
            const url = 'api/users/id/' + queryArr.shift();
            let observable = null;
            if (previousObservable) {
                observable = previousObservable.flatMap(() => {
                    return this.http.get(url);
                });
            } else {
                observable = this.http.get(url);
            }
            return this.doUsersRequest(queryArr, observable);
        } else {
            return previousObservable;
        }
    }