Angular2 HTTP观察到

Angular2 HTTP观察到

问题描述:

我有一个调用HTTP观察到Angular2 HTTP观察到

SaveWorkRequest(workRequest: any) { 
    let headers = new Headers({ 'Content-Type': 'application/json' }); // ... Set content type to JSON 
    let options = new RequestOptions({ headers: headers }); // Create a request option 
    let url = 'deployment/SaveWorkRequest'; 
    let dto = { 'workResponse': workRequest }; 

    // post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>; 
    return this.http.post(GlobalVariables.SITE_ROOT + url, dto, options) 
     //.toPromise() 
     //.then(this.extractData) //...and calling .json() on the response to return data 
     .map(this.extractData) 
     .catch(this.handleError); 
} 

// 
private extractData(res: Response) { 
    let body = res.json(); 
    console.log(body); 
    return body || {}; 
} 

而这种代码在调用它的组件下面的方法

 let response = this.workRequestService.SaveWorkRequest(this.workRequest) 
     .subscribe(
      hero => this.message = hero, 
      error => this.errorMessage = <any>error); 



    console.log(this.message); 

的问题是,在该组件返回的代码之前服务方法。所以console.log(this.message)是未定义的。这一定是我猜的时间问题?

是的,这是计时问题。 console.log(this.message);语句在响应从您的http请求到达之前得到执行。您应该在订阅内写入日志语句,如下所示。

let response = this.workRequestService.SaveWorkRequest(this.workRequest) 
    .subscribe(
     hero => 
     { 
      this.message = hero; 
      console.log(this.message); 
     }, 
     error => this.errorMessage = <any>error); 

试试这个:

ngOnInit() { 
    this.getMessage().subscribe(_ => { 
     console.log(this.message) 
    }); 
} 

public getMessage() { 
    return this.workRequestService.SaveWorkRequest(this.workRequest) 
    .map(hero => this.message = hero,error => this.errorMessage = <any>error); 

Observable是异步的。如果您尝试console.log(this.message);,您将收到未定义的值,直到订阅值为止。

在模板上,只需添加{{ this.message?.some_property }}如果您关心的错误可能会出来。