我的服务上有一个方法可以获取所有模板,并返回一个Observable数组的Template对象。我正在尝试向服务中添加一个新方法,该方法获取模板数组,但对其进行过滤以按名称在数组中获取特定模板。
有没有一种方法可以使它只返回一个可观察的Template数组,而不是一个包含一个项的Observable Template数组?我对rxjs语法还很陌生,以至于我不了解如何使用诸如reduce之类的东西。
这是我获取所有模板的方法。
getAllTemplates(): Observable<Template[]>{
const uri = this.baseService.rootTemplatesUri;
return this.http.get<Template[]>(uri)
.pipe(
catchError((error: HttpErrorResponse) => { return throwError(error); })
);
}
这是我尝试按名称过滤的操作,如果存在匹配的名称,它将返回一个包含一个元素的数组:
getTemplateByName(name:string):Observable<Template[]>{
const uri = this.baseService.rootTemplatesUri;
return this.http.get<Template[]>(uri)
.pipe(
map(templates => {
return templates.filter(template => {
return template.Name === name;
})
}),
catchError((error: HttpErrorResponse) => { return throwError(error); })
);
}
是否有一种方法可以通过过滤此方法来返回单个Observable?
答案 0 :(得分:1)
使用map
RxJS运算符时,返回的observable具有在map
运算符内部返回的类型。 JavaScript filter
方法返回一个新数组,如its documentation中所述。这就是为什么您的getTemplateByName
方法返回可观察到的Template[]
元素的原因。
如果需要使getTemplateByName
方法返回可观察的Template
元素,则需要在Template
运算符内返回单个map
元素。 JavaScript find
方法按照Array.prototype.find()中所述进行操作。只需使用它即可实现所需的行为。
getTemplateByName(name:string):Observable<Template>{
const uri = this.baseService.rootTemplatesUri;
return this.http.get<Template[]>(uri)
.pipe(
map(templates => {
return templates.find(template => {
return template.Name === name;
})
}),
catchError((error: HttpErrorResponse) => { return throwError(error); })
);
}