【问题标题】:How to subscribe subject to observable function with params如何使用参数订阅可观察函数
【发布时间】:2020-03-01 13:49:57
【问题描述】:

我有具有任意可观察参数的函数,它正在做一些工作。 我想订阅一个有其他订阅的主题(为了让所有被调用的函数触发)。

我找不到正确的方法。

我的服务:

//The method of the observable 
addProduct2(product: Product) {     
  delete product.id;
  const url = 'http://localhost:8080/createProduct';
  return this.http.post<Product>(url, product);
}

我希望这会起作用:

getProductsEvent:Subject<Product> = new Subject();

constructor(private http: HttpClient, private currentRoute: ActivatedRoute) {
  //....
  this.addProduct2.subscribe(this.getProductsEvent);
}

我得到这个编译错误:

错误 src/app/components/products-feature/data-service.service.ts(42,22): 错误 TS2339:类型“(产品: 产品)=> 可观察的'。

在日志中:

AppComponent.html:3 ERROR TypeError: this.addProduct2.subscribe 不是 一个函数 在新的 DataServiceService (data-service.service.ts:42)...

我怎样才能正确地实现它?我缺少什么?

记住我不能调用

this.addProduct2().subscribe...; 

因为它有一个参数,我不知道它会得到什么参数。

【问题讨论】:

  • 不清楚你想在这里实现什么。是否要在返回 http 响应时在 getProductsEvent 中发出值?
  • 是的,实际上 getProductsEvent 是我用来在某些组件之间传递数据的常见主题。我想将它插入这个 addProduct 操作,因为它会再次执行订阅者(并在发布后刷新数据)。 @KurtHamilton
  • 我建议您努力提高问题的质量。人们对您投反对票并投票结束。我知道不是每个人都能说流利的英语,但你可以从正确格式化你的代码开始。如果人们看到您在问题上付出了认真的努力,他们会更愿意提供帮助。另请阅读:stackoverflow.com/help/how-to-ask。我为你改进了格式。

标签: angular typescript rxjs observable subject


【解决方案1】:

如果您想在每次创建新产品时发出一个事件,您必须在您的 productsEvent 上调用 next Subject

private productEvent: Subject<Product> = new Subject(); 

public getProductsEvent(); Subject<Product> {
  return this.productEvent;
}

public addProduct(product: Product): Observable<Product> {
  delete product.id;
  const url = 'http://localhost:8080/createProduct';
  return this.http.post<Product>(url, product).pipe(
    tap((product: Product) => this.productEvent.next(product)),
  );
}

在您的 http post 请求返回新产品后,我使用管道和 pipable tap 运算符调用 next 。 addProduct 方法返回一个 observable,这意味着在您订阅它之前什么都不会发生。

通过这样的所有设置,您可以按如下方式使用它:

您可以通过调用方法和订阅来添加产品。

addProduct(data).subscribe();

在您订阅活动的任何地方都会收到通知:

getProductsEvent().subscribe((addedProduct: Product) => {
  // Do something with the added product
  console.log(addedProduct)
});

注意 我保留了你问题中的类型,但我想知道你发布的数据类型 Product 是否与响应的类型相同,也是 @987654329 @ 但我猜你最了解你的对象类型,所以我保持原样。

【讨论】:

  • 谢谢,我已经了解了 Observable 和 Subjects,并且我尝试将主题订阅到使 get(在服务上)的 observable,并从那里订阅 getData 的事件到组件上的事件的名单。在 addProduct comp 中,我希望在帖子成功返回后,再次调用主题(这将触发 get observable),因为数据将被更新。显然它不起作用,我在组件内部使用主题时遗漏了一些东西,我只是想让它变得简单,我假设我应该通过角度教程传递可观察对象
  • @lingar 如果您查看代码,this.addProduct2 是一个函数,addProduct 函数。 this.addProduct不是Observable实例。所以你不能订阅它...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 2012-10-14
  • 2018-11-26
相关资源
最近更新 更多