【问题标题】:Property 'subscribe' does not exist on type 'Promise<Observable<Object>>' angular service call类型“Promise<Observable<Object>>”角度服​​务调用上不存在属性“订阅”
【发布时间】:2021-10-07 22:11:36
【问题描述】:

尝试在 Angular 中为组件进行初始化时的服务调用,我从中获取数据的服务器需要一些时间来响应,因此我尝试使用承诺将返回的数据分配给我的 this.stats组件

在尝试编写函数时,我得到 -> 我的“订阅”(在我的组件中)的“Promise”类型上不存在属性“订阅”我试图重写函数几次方式,我无法改变错误,我可能只是在做这个根本错误,但在这里找不到任何与我的确切情况相匹配的东西,所以我想我会寻求任何可能的解释...... . 也许我需要改变一些类型转换?

组件

export class StatsComponent implements OnInit {
  @Input() stats: any
  @Output() onUpdateStats: EventEmitter<Object> = new EventEmitter()

  constructor(private specsService: SpecsService) { }

  async ngOnInit(): Promise<void> {
    await this.specsService.getStats().subscribe((response) => {this.stats=response});
  }

  updateStats(){
    console.log(this.stats)
    this.onUpdateStats.emit()
    
  }

}

services.ts

 async getStats():Promise<Observable<Object>>{
    return await this.http.get(`http://localhost:8888/fetchStats`)
   
  }

【问题讨论】:

  • 您必须等待才能获得 observable then 订阅,但是为什么要混合 observables 和 promises 这样呢?只需返回可观察对象
  • 根据您发布的内容很难 100% 清楚,但我认为 getStats 应该只是:return this.http.get('http://localhost:8888/fetchStats');

标签: angular async-await subscribe


【解决方案1】:

你不应该把 promise 和 observable 混在一起。 Angular 自带的 RxJs 使用了 Observable 设计模式,你一定要坚持它,避免使用 async/await。

服务:

getStats():Observable<Object>{
   return this.http.get(`http://localhost:8888/fetchStats`)
}

组件:

export class StatsComponent {
  @Output() onUpdateStats: EventEmitter<Object> = new EventEmitter();
  stats: Observable<Object>;

  constructor(private specsService: SpecsService) {
      this.stats = this.specsService.getStats();
  }

  updateStats(){
    console.log(this.stats)
    this.onUpdateStats.emit()
  }

}

【讨论】:

  • 混合观察和承诺是很常见的。 RxJs 甚至还有toPromise 方法?
  • 是的,但是当你只能使用 observables 时,在这里(并且大多数时候)使用 promise 有什么意义呢? RxJs 比 Promise 更加强大和灵活。
  • 在你看来
  • 问题是,在示例中,Observables 和 Promises 是混用的。所以如果想使用 await,你可以调用:await myObservable.toPromise() 或者你可以在 observable 上调用 subscribe()。在 Promise 中包装 observable 是没有意义的:Promise&lt;Observable&lt;Object&gt;&gt; RxJs 是我的偏好,但 Promise 有时会很有用。
  • 谢谢大家,我对可观察对象进行了更深入的研究,以了解它们是如何工作/收益与承诺等的,我能够通过减少一切以仅使用可观察类型来解决
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 2018-02-01
  • 2017-03-13
  • 2017-11-26
  • 2019-01-03
  • 2018-06-25
  • 2020-07-13
相关资源
最近更新 更多