Подтвердить что ты не робот

Angular 2: два бэкэнд-сервиса требуют успеха первой службы

В моем приложении Angular 2 у меня есть бэкэнд-сервис, как показано ниже.

getUserInterests() {
    return this.http.get('http://localhost:8080/test/selections').map((res: Response) => res.json());
}

После вызова этой службы я хочу вызвать другую службу при успешном предыдущем.

Вторая услуга

let params: URLSearchParams = new URLSearchParams();
    params.set('access_token', localStorage.getItem('access_token'));
    return this.http.get('http://localhost:8080/user/selections', { search: params }).map((res: Response) => res.json());

Эти две службы отдельно возвращают два массива JSON. Затем мне нужно сделать логин с этими двумя массивами.

EDITED

service.ts

getUserInterests() {
    return this.http.get('http://localhost:8080/test/selections').map((res: Response) => res.json());
}

getSavedSelections() {
    let params: URLSearchParams = new URLSearchParams();
    params.set('access_token', localStorage.getItem('access_token'));
    return this.http.get('http://localhost:8080/interest/user/selections', { search: params }).map((res: Response) => res.json());
}

getSelectionList() {
    var obs = this.getUserInterests().flatMap(
        (interests) => {
            return Observable.forkJoin([
                Observable.of(interests),
                this.getSavedSelections()
            ]);
        }
    );
    return obs;
}

Затем я использую следующее в другом файле ts для вызова службы.

export class InterestsComponent {
  private interests;
  private saved_interests;
  constructor(private dataService: DataService) {
    this.dataService.getSelectionList().subscribe(
        (result) => {
            var interests = result[0];
            var selections = result[1];
        }
    );
  }
}

Но это дает следующую ошибку в журнале консоли.

ORIGINAL EXCEPTION: TypeError: this.dataService.getSelectionList is not a function

Любые предложения приветствуются.

4b9b3361

Ответ 1

Вам нужно использовать оператора flatMap для вызова одного запроса после завершения предыдущего:

this.service.getUserInterests().flatMap(
  (interests) => {
    let params: URLSearchParams = new URLSearchParams();
    params.set('access_token', localStorage.getItem('access_token'));
    return this.http.get('http://localhost:8080/user/selections', {
      search: params
    }).map((res: Response) => res.json());
  }
);

При подписке на этот поток данных вы получите результат только последнего запроса.

Вы можете использовать метод Observable.forkJoin для возврата обоих. Вот пример:

var obs = this.service.getUserInterests().flatMap(
  (interests) => {
    return Observable.forkJoin([
      Observable.of(interests),
      this.service.getUserSelections()
    ]);
  }
);

obs.subscribe(
  (result) => {
    var interests = result[0];
    var selections = result[1];
  }
);