在我的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数组。然后,我需要使用这两个数组进行一些登录。
已编辑
服务
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文件中使用following来调用服务。
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
任何建议表示赞赏。
您需要利用flatMap操作员在前一个请求完成后调用一个请求:
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方法返回两者。这是一个示例:
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]; } );