为什么不能将HttpClient结果传递给类属性?

时间:2019-07-15 13:19:19

标签: angular angular-httpclient

我对此一无所知。我上下搜索了互联网,花了至少两个小时在HttpClient上查看SO答案,却一无所获。

我有这项基本服务,应该从REST端点检索一些数据

import { Injectable, Inject } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class UtilityService {
  public getSavedProject() {
    return this.http.get(this.baseUrl + 'api/ProjectAction/RetrieveActions');
  }
}

然后此代码将用于第二个服务中,我在其中添加了以下代码

@Injectable({
  providedIn: 'root'
})
export class ProjectTreeActionService {
  //...
  private data;

  constructor(private utilityService: UtilityService) {}

  getSavedProject() {

    this.utilityService
      .getSavedProject()
      .subscribe((result) => this.data = result[0].toString() );

    return this.data;
  }

这是每个教程和示例中或多或少描述的最基本的行为。但是,在我的情况下,最后一行return this.data总是给我undefined

我已经通过将其记录到subscribe回调中的控制台中来检查是否正确检索了预期结果,但是我无法将值写入到需要继续使用它的类属性中

我缺少什么部分?

2 个答案:

答案 0 :(得分:4)

理想情况下,df %>% group_by(group) %>% mutate( Key = case_when( n() > 1 ~ paste(link[1], link[n()], sep = ", "), TRUE ~ as.character(link) ) ) 应该返回一个getSavedProject()并包装您应该在Observable方法内映射的值。

在这里,尝试一下:

getSavedProject()

假定此方法将在组件中使用,要提取@Injectable({ providedIn: 'root' }) export class ProjectTreeActionService { private data; constructor(private utilityService: UtilityService) {} getSavedProject() { return this.utilityService .getSavedProject() .pipe( map(result => result[0].toString()) ); } } 方法返回的数据,您将必须getSavedProject()subscribe。否则,您必须将getSavedProject()分配给类属性,然后使用getSavedProject()管道在组件模板中将其解包。

答案 1 :(得分:1)

您只需在呼叫方中订阅您的服务方法即可。

例如-

@Injectable({
  providedIn: 'root'
})
export class ProjectTreeActionService {

  private data;

  constructor(private utilityService: UtilityService) {}

  getSavedProject(): Observable<any> {
    return this.utilityService
      .getSavedProject();
  }
}

,当您拥有ProjectTreeActionService的实例时,可以在那里预订它。

this.projectTreeActionServiceInstance.getSavedProject().subscribe(result => {
    //manipulate the result[0].toString() here;
});