什么时候调用Angular Http模块的订阅方法

时间:2017-11-13 22:45:38

标签: angular angular2-services angular-http

我有一个组件类和服务类。我有接收http 200状态代码时翻转标志的逻辑。根据收到的响应,我使用if条件翻转标志。

Requests(data:Array<String>):Observable<any>{
    return this.http.post(this.Url,data)
      .map(
        (res:Response) => {
          if(res.status === 200 || res.status===201) {
            return res.json()
          }
        }
      )
      .catch((error:any) => Observable.throw(error.json().error || 'Server error'));

  }

组件文件是这样的。

methodName(selectedData){

    this.service.Requests(Id).subscribe((Response => {
      this.rResponse = Response;

    }));
    if(rResponse){
    // My logic to flip the flag
        }
      }
    }
    }

因此,根据从服务收到的回复,我将翻转旗帜。

但是当我在调试工具中运行代码时,即使rResponse变量中有值,也不会调用翻转标志的逻辑。事实上,当调用methodName函数时,代码流会尝试首先在if循环下检查rResponse的值,然后在结束时调用subscribe方法。

如果可以,请建议订阅方法的工作流程。为什么在调用实际的subscribe方法之前调用if条件。

这不是重复,因为我想理解为什么流不会转到我的if循环。没有什么不确定的。我从服务中获取价值

1 个答案:

答案 0 :(得分:0)

我的理解是你想在rResponse收到价值时做一些逻辑。

正如您可能知道的那样,订阅方法调用本质上是异步的,即一旦请求它就会使执行恢复到下一行。

因此,如果条件在subscribe方法之外写入,则条件在服务调用完成之前立即执行。这导致空响应。

因此,您需要将if条件放在要分配this.rResponse = Response;

的同一块中
methodName (selectedData) {    
    this.service.Requests(Id).subscribe((Response => {
        this.rResponse = Response;
        if(this.rResponse) {
            // My logic to flip the flag
        }      
    }));        
}