Angular 2:在第一个服务成功后进行两个后端服务调用

16
在我的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数组。然后我需要使用这两个数组进行一些登录操作。

已编辑

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;
}

然后我在我的另一个类型文件中使用以下内容来调用该服务。

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

欢迎提出任何建议。

1个回答

18

你需要利用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];
  }
);

什么是兴趣? - Rose18
我该如何获取两个服务的响应? - Rose18
我更新了我的答案,描述了如何在订阅回调中获取这两个请求的结果... - Thierry Templier
如果您需要两个响应内容,是的 ;-) - Thierry Templier
如果您在控制台中显示dataService实例(使用console.log(this.dataService);),您能看到什么?是否有这个方法? - Thierry Templier
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接