我有一个带有3个公共方法的服务。它们取决于CCD_ 1的结果。CCD_ 2是返回CCD_ 3的getter。
public createObligation(id: string): Observable<void> {
return this.getObligationsUrl(id).pipe(
map(dossierIds => {
const endpoint = `${this.getObligationsUrl(dossierIds)}/blablabla}`;
return this.http.post(endpoint);
})
);
}
public deleteMortgageObligation(id: string): Observable<void> {
return this.getObligationsUrl(id).pipe(
map(dossierIds => {
const endpoint = `${this.getObligationsUrl(dossierIds)}/blablabla/${id}`;
return this.http.delete(endpoint);
})
);
}
public updateObligation(id: string): Observable<void> {
//..
}
private getObligationsUrl(dossierIds: DossierIds): string {
return this.dossierService.dossierIds.pipe(
map(dossierIds => {
const dossierId = dossierIds.getDossierId();
const moId = dossierIds.getObligationsId();
return `${BASE_URL}/${dossierId}/${OBLIGATIONS_URL}/${moId}`;
}),
);
}
这些方法将用于类似的组件
this.createObligation(123).subscribe(result => {
console.log(result);
})
但是TypeScript在所有3种方法中都给我带来了一个错误,说:
Type 'Observable<Observable<void>>' is not assignable to type 'Observable<void>'. Type 'Observable<void>' is not assignable to type 'void'.
我甚至没有看到我的HTTP请求被触发。我哪里搞错了?
没有进行http调用的原因是您没有订阅内部可观察对象。
1 public deleteMortgageObligation(id: string): Observable<void> {
2 return this.getObligationsUrl(id).pipe(
3 map(dossierIds => {
4 const endpoint = `${this.getObligationsUrl(dossierIds)}/blablabla/${id}`;
5 return this.http.delete(endpoint);
6 })
7 );
8 }
在第5行,您返回了一个observable,但它从未被订阅。因此,第2行返回Observable<Observable<>>
。您需要确保这个内部可观察到的内容被订阅到,并且它的结果被推送到流中。
这正是";高阶映射算子";是的。他们做以下事情:
- 将传入值映射到另一个可观察值
- 订阅它,所以它的值被发送到流中
- 管理从这些"预订"中取消预订;内部订阅">
在您的情况下,我们可以简单地在#3行使用switchMap
,而不是map
:
1 public deleteMortgageObligation(id: string): Observable<void> {
2 return this.getObligationsUrl(id).pipe(
3 switchMap(dossierIds => {
4 const endpoint = `${this.getObligationsUrl(dossierIds)}/blablabla/${id}`;
5 return this.http.delete(endpoint);
6 })
7 );
8 }