angular - 嵌套服务中的 Angular 嵌套 observable - 如何
问题描述
我知道如何在同一个组件/服务中做嵌套的 observable 。或者如何将一个可观察对象从服务返回到组件。但是我如何从一个服务 observable 获取数据到我的组件中,从另一个服务 observable 获取数据:
一个简化的场景:
我有一个 APIService 通过 observable 返回我的数据:
export class StockAPIService {
// ...
getProducts(): Observable<any> {
return this.http.get<any>(this.productsUrl);
}
}
我通常会在组件中像下面这样使用它:
export class ProductsComponent {
products = {};
ngOninit() {
stockApiService.getProduct().subscribe(products =>
this.products = doCalcWithProducts(products))
}
doCalcWithProducts() {
// ALLOT of business logic comes here that I want to move to a service
}
}
所以我想做一个看起来像这样的服务:
export class ProductService {
doCalcWithProducts(): observable<any> {
return stockApiService.getProduct().subscribe(products =>
return doMoreCalcWithproducts(products))
}
}
然后我的组件实际上只看起来像这样:
export class ProductsComponent {
products = {};
ngOninit() {
this.ProductService.doCalcWithProducts().subscribe(products =>
this.products = products)
}
}
...删除了业务逻辑,但仍将我的 APIService 与我的 ProductService 分开
但我收到错误类型“订阅”不可分配给类型“可观察”。 在 ProductService 订阅
而且我尝试了从管道到地图的所有方法,而不是订阅...
解决方案
ProductService
必须返回Observable
一个. 这意味着您不能在doCalcWithProducts()
方法内订阅。
您应该stockApiService.getProduct()
通过 map 函数传递结果。像这样:
export class ProductService {
doCalcWithProducts(): Observable<any> {
return stockApiService.getProduct().pipe(
map(products => this.doMoreCalcWithproducts(products))
);
}
}
推荐阅读
- node.js - 如何解决 express js 中没有“Access-Control-Allow-Origin”?
- mysql - MySQL - 在重复键更新时插入... - 如何区分插入或更新?
- python - 将新 anaconda 的 python 版本更改为现有的 python 版本
- angular - 使用 setValidators 验证动态字段
- c# - 如何将base64字符串转换为FormFile
- mysql - Mysql Trigger - 更新另一个表时更新表
- spring-boot - 在 tomcat 服务器中上传大文件时 Spring Boot 中的 504 网关超时问题
- laravel - 如何在 Laravel 5.8 上为 IE11 编译 vue.js 和 tailwind.js
- reactjs - 如何使用输入选择方法通过 id 更新嵌套对象的状态?
- shell - 无法遍历 for 循环中的所有元素