2016-04-19 2 views
13

В моем приложении Angular 2 у меня есть бэкэнд-сервис, как показано ниже.Угловой 2: Два вызова бэкэнда на успех первого сервиса

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

второй сервис

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 Массивы. Затем мне нужно сделать логин с этими двумя массивами.

РЕДАКЦИИ

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 

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

ответ

17

Вы должны использовать оператор 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]; 
    } 
); 
+0

Что такое интересы? – Rose18

+0

Как я могу получить ответы на две службы? – Rose18

+0

'интересы' соответствует результату первого запроса. –