【问题标题】:undefined value from subscribe to observable从订阅到可观察的未定义值
【发布时间】:2019-01-04 01:48:41
【问题描述】:

我知道有很多关于这个问题的问题,但没有一个有助于解决我的问题。 从组件订阅服务,它总是返回 undefined.. 对此我失去了理智。

组件

ngOnInit() {
  this.dataService.getAllPartners().subscribe(data => 
      {this.partners = data
        console.log("data " + data);},// i can see the data returns 
      error => {
      LoggerService.error('Failed to load partners.')
    });
    console.log("Partners " + this.partners);// partners is undefined 
  }

服务:

 private serviceUrl = '/partners';
 private headers = new HttpHeaders()
    .set('Content-Type', 'application/json');

    constructor(private httpClient: HttpClient) { }

    /**
   * Fetch  partners from the server
   */   
    getAllPartners(searchParams?: Object): Observable<Partner[]> {
      return  this.httpClient.get(Constants.BASE_SERVICE_URL + serviceUrl , {
        params: HttpRequestService.buildRequestOptions(searchParams),
        headers: this.headers
    })

}

【问题讨论】:

  • “它们都不能帮助解决我的问题” - 相反,许多现有的问题可以准确地告诉你问题是什么:外部 订阅,回调尚未被调用,因此属性 无法 被设置。您可以在控制台中看到这一点:Partners 打印在 之前 data

标签: angular


【解决方案1】:

所以基本上这行代码

console.log("Partners " + this.partners); 

.subscribe里面的代码之前运行

   this.dataService.getAllPartners().subscribe(data => { 
    // What happens here is after the request has been processed
}

那是因为订阅是异步操作,需要一些时间,所以你需要在订阅里面做你的console.log。

请注意,订阅是长期有效的,需要像下面这样使用您的组件取消订阅。

import {  Subscription } from 'rxjs';

    private subscription : Subscription;
    ngOnInit() {
       this.subscription = this.dataService.getAllPartners().subscribe(data =>
            {this.partners = data;
                console.log("data " + data);}, 
            error => {
                LoggerService.error('Failed to load partners.')
            });

    }

    ngOnDestroy() {
        this.subscription.unsubscribe();
    }

但你也不应该像现在这样订阅。理想情况下,您应该使用模板内的| async 管道进行订阅,因为 Angular 将为您处理所有这些。

所以在你的组件中这样做

ngOnInit() {
           this.partners = this.dataService.getAllPartners();
        }

在你的模板中

<ng-container *ngFor="let partner of partners | async">
    // Your html markup for each partner here 
    {{partner.name}}
 </ng-container>

【讨论】:

  • 我是 Angular 新手……你是我的英雄!唯一的问题是|模板上的异步给了我“InvalidPipeArgument:'[object Object],[object Object]”错误。所以我不得不删除它
  • 没问题 :),我需要查看您的 html 标记以查看管道有什么问题。异步管道是 Angular 的一部分,因此无需导入任何内容。顺便说一句,您使用的是哪个版本的角度?
  • 我正在使用 Angular 7.1.3... 我的痕迹很长,但我的应用程序现在可以正常工作了:) 我终于可以继续前进了。再次感谢!
  • 啊好吧..您可能仍在订阅组件中的可观察对象,因此您不需要异步管道。 (确保你在ngOnDestroy()退订)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 2020-07-29
  • 1970-01-01
相关资源
最近更新 更多