RxJS - 解决多个服务器调用

时间:2017-09-11 14:28:07

标签: angular rxjs

我在Angular 4中使用RxJS来编写异步调用。

我需要调用服务器,获取响应并使用它来进行另一个调用,获取响应并使用它来进行另一个调用,依此类推。我正在使用以下代码,这可以按预期工作

id;
name;
ngOnInit() {
    this.route.params
      .flatMap(
      (params: Params) => {
        this.id = params['id'];
        return this.myService.get('http://someurlhere');
      }
      )
      .flatMap(
      (response: Response) => {
        return this.myService.get('http://someurlhere');
      })
      .flatMap(
      (response: Response) => {
        return this.myService.get('http://someurlhere');
      })
      .subscribe(
      (response: Response) => {
        FileSaver.saveAs(blob, this.name );
      },
      (error) => {        
        console.log('Error ' + error)
      }
      )
  }

现在,我需要对它做一些改变。在第一个flatMap中,我需要进行2次休息调用,并且仅在两者都被解析时才进行。不仅如此,只有其中一个的响应将传递到下一个flatMap,因为另一个调用只会填充一个变量

id;
name;
ngOnInit() {
    this.route.params
      .flatMap(
      (params: Params) => {
        this.id = params['id'];
         // this is the 2nd REST call. It just populates a variable, so don't need the output to be passed to next flatMap. However, both the URLs in this section should resolve before the next flatMap is executed.
        this.name = this.myService.get('http://someotherurlhere');
        return this.myService.get('http://someurlhere');
      }
      )
      .flatMap(
      (response: Response) => {
        return this.myService.get('http://someurlhere');
      })
      .flatMap(
      (response: Response) => {
        return this.myService.get('http://someurlhere');
      })
      .subscribe(
      (response: Response) => {
        FileSaver.saveAs(blob, this.name );
      },
      (error) => {        
        console.log('Error ' + error)
      }
      )
  }

所以,我的问题是,如何编写这段代码以便它从服务器获得响应,但在转移到下一个flatmap之前等待其他的rest调用也完成。

this.name = this.repoService.getDocProperties(this.objectId);

1 个答案:

答案 0 :(得分:1)

您可以将异步调用与forkJoin结合使用

在您的情况下,您有两个电话:

this.myService.get('http://someotherurlhere');
this.myService.get('http://someurlhere');

它们可以这样组合:

let call1 = this.myService.get('http://someotherurlhere');
let call2 = this.myService.get('http://someurlhere');
return Observable.forkJoin([call1, call2])

当你订阅(或链接一些其他函数)到连接的observable时,返回的数据将在一个数组中。因此,call1的结果将位于索引0处,call2位于索引1处。

Observable.forkJoin([call1, call2]).subscribe((results) => {
  results[0]; // call1
  results[1]; // call2
});