angular - 类型'可观察的' 不可分配给 Observable 类型rxjs 角度
问题描述
在 Angular 中,我创建了一个从不同服务获取数据并将数据与第一个服务合并的服务。这是代码
searchData(): Observable<MyData> {
const url = `${this.context}/search`;
return this.http.get<MyData>(url)
.pipe(
map((myData: MyData) => {
return this.secondService.getOtherData().subscribe((data) => {
// some manipulation
return myData;
});
}));
}
但这显示了错误
Type 'Observable<Subscription>' is not assignable to type 'Observable<MyData>'.
Type 'Subscription' is missing the following properties from type 'MyData': data, dataCount
我该如何解决这个问题?
解决方案
你快到了。RxJS 运算符map
用于操作从 observable 发出的数据并转发它。
选项 1:依赖的 observables
要从一个 observable 映射到另一个,您需要使用更高阶的映射运算符,例如switchMap
.
searchData(): Observable<MyData> {
const url = `${this.context}/search`;
return this.http.get<MyData>(url).pipe(
switchMap((myData: MyData) => // <-- `switchMap` here
this.secondService.getOtherData().pipe( // <-- assuming `getOtherData()` depends on response from 1st call
map((data: any) => { // <-- `map` here
// some manipulation
return myData;
})
)
)
);
}
选项 2:独立的 observables
如果 observables 不相互依赖,你可以使用类似 RxJSforkJoin
的函数来并行触发 observables。
searchData(): Observable<MyData> {
const url = `${this.context}/search`;
return forkJoin({
myData: this.http.get<MyData>(url),
secondData: this.secondService.getOtherData().pipe( // <-- assuming `getOtherData()` doesn't depend on response from 1st call
map((data: any) => {
// some manipulation
return manipulatedData;
})
)
});
}
在这种情况下,您将在订阅中获得两个响应。
this.searchData().subscribe({
next: (res: any) => {
// res.myData
// res.secondData
},
error: (error: any) => {
// handle error
}
});
有关避免嵌套订阅的更多信息,请参见此处。
推荐阅读
- msdtc - MSDTC WS-AT, HTTP could not register URL https://+:2372/WsatService/. Your process does not have access rights to this namespace
- python-3.x - How can I install and import dnspython in aws-lambda?
- python - list of lists - assigning values inside of list of lists to variables, changing values inside of list of lists due to local variable functions
- python - Python Pandas:在排序的多索引数据框中找到 n 并为每个级别 1 索引返回 [0:n+1]
- java - When you extend an abstract class which implements an interface, is it good to also mention this in the child class?
- javascript - 在 mongodb 的投影中使用数学函数
- database - 根据前一个 24 小时平均值查询浓度的时间和平均值
- javascript - 在 v9 中删除集合 firebase
- python - 硒不运行Javascript
- javascript - Javascript:坚持比较功能