Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 为什么我不能将HttpClient结果传递给类属性?_Angular_Angular Httpclient - Fatal编程技术网

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

Angular 为什么我不能将HttpClient结果传递给类属性?,angular,angular-httpclient,Angular,Angular Httpclient,我完全被这件事缠住了。我上下搜索了互联网,花了至少两个小时在HttpClient上查看SO答案,但一无所获 我有这个基本服务,它应该从REST端点检索一些数据 import { Injectable, Inject } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; @Injectable({ providedIn: 'root' }) export class Ut

我完全被这件事缠住了。我上下搜索了互联网,花了至少两个小时在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;
  }

这是每个教程和示例中或多或少描述的最基本的行为。但是在我的例子中,最后一行返回this.data总是给我一个未定义的值

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


我缺少什么部分?

您可以在调用者中订阅您的服务方法

例如—

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

  private data;

  constructor(private utilityService: UtilityService) {}

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

您只需在调用者中订阅服务方法即可

例如—

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

  private data;

  constructor(private utilityService: UtilityService) {}

  getSavedProject(): Observable<any> {
    return this.utilityService
      .getSavedProject();
  }
}
理想情况下,getSavedProject应该返回一个可观察的值,该值应该映射到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方法返回的数据,您必须订阅getSavedProject。或者,您必须将getSavedProject分配给一个类属性,然后使用异步管道在组件模板中展开它。

理想情况下,getSavedProject应该返回一个可观察的包装值,该值应该映射到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方法返回的数据,您必须订阅getSavedProject。或者,您必须将getSavedProject分配给类属性,然后使用异步管道在组件模板中展开它。

您正在对ProjectTreeActionService的getSavedProject函数进行异步调用。请尝试将“return this.data”放在this.data=result[0]之后。ToStringBasic通常也会遇到同样的问题,您缺少的部分是异步的。当您执行uservice.getSavedProject.subscribe…,您基本上告诉您的程序:获取uservice.getSavedProject返回的可观察结果,并将其值分配给类属性数据。然后返回未定义的类属性数据,因为还没有结果。然后得到结果并将其值赋给数据,但为时已晚。感谢您的提示,我终于解决了这个问题。您正在对ProjectTreeActionService的getSavedProject函数进行异步调用。请尝试将“return this.data”放在this.data=result[0]之后。ToStringBasic通常也会遇到同样的问题,您缺少的部分是异步的。当您执行uservice.getSavedProject.subscribe…,您基本上告诉您的程序:获取uservice.getSavedProject返回的可观察结果,并将其值分配给类属性数据。然后返回未定义的类属性数据,因为还没有结果。然后你得到结果并将其值赋给数据,但那太晚了。谢谢你的提示,我终于解决了这个问题。我接受这个答案,因为它最接近我最终实现的解决方案。我接受这个答案,因为它最接近我最后实现的解决方案。@MarkusDeibel我认为这应该是一个可以接受的答案。这是一种与您所寻找的内容更相关、更好的方式@我认为这应该是一个公认的答案。这是一种与您所寻找的内容更相关、更好的方式