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

Why can I not pass the HttpClient result to a class property?

我完全被这个困住了。我已经在互联网上上下搜索并花了至少两个小时查看 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 回调中将其记录到控制台来检查是否正确检索了预期结果,但我无法将值写入 class 属性 我需要它才能继续使用它。

我缺少什么部分?

您可以在调用方订阅您的服务方式即可。

例如 -

@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;
});

理想情况下,getSavedProject() 应该 return 一个 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() 方法 return 编辑的数据,您必须 subscribe 到 [=11] =].或者您必须将 getSavedProject() 分配给 class 属性,然后使用 async 管道将其解包到组件模板中。