Angular 2 http - 有条件地发送请求

时间:2017-12-12 12:43:31

标签: angular angular-http

您好我需要处理HTTP。我需要使用条件发送请求,例如:

我需要发送POST /api/files - 但发送是以服务器api为条件的: GET /api/condition - 返回true或false。如果返回true,则可以调用/api/files,如果为false,则需要调用POST /api/enable.

1。 GET / api / condition

1 a。 return true - > 2。

1 b。 return false - > 3。

2。 POST / api / files

3。 POST / api / enable - > 1。

最简单的方法如下:

load(){
 http.get(/api/condition).subscribe(response => {
   if(response == true)
      http.post(/api/files).subscribe()
    else http.post(/api/enable).subscribe(x => this.load())
  })
 }

但目前尚不清楚解决方案。有什么方法可以创造这个?谢谢

2 个答案:

答案 0 :(得分:1)

post方法返回一个cold observable,因此需要调用subscribe来执行它。所以你拥有的是最简单的方法。你可以做一些小的重构,但核心原则将保持不变

答案 1 :(得分:1)

嗯,你得到的代码工作唯一可以做的就是模块化整个块并将其拆分成适当的函数。

检查条件请求

fetchCondition(): Observable<boolean> {
   return http.get(/api/files).map((response: boolean) => response);
}

获取文件

fetchFiles(): Observable<YourFile[]> {
   return http.post(/api/files).map((response: YourFile[]) => response);
}

启用文件提取

enable(): Observable<any> {
   http.post(/api/enable).map((response: any) => response);
}

逻辑 - 将各个部分放在一起

load(){
   this.fetchCondition().subscribe(
       condition => {
          if(condition) {
             this.fetchFiles().subscribe(
                files => this.doSomethingWithFiles(files),
                err => { /* handle */ }
             );
          } else {
             this.enable().subscribe(resp => this.load());
          }
       },
       err => { /* handle */ }
   );
}

请注意,您可以进入无限循环! 如果您的服务器以某种方式无法启用您在功能开始时检查的条件,则运行加载功能可能会使您无限循环。 我会建议某种计数器/调度程序来处理这种漏洞。当然,这完全取决于应用程序的上下文和复杂性。