Jen*_*r S 2 javascript arrays filter rxjs angular
我的服务中有一个方法可以获取所有模板,并返回模板对象的 Observable 数组。我正在尝试向我的服务添加一个新方法,该方法获取模板数组,但对其进行过滤以按名称获取数组中的特定模板。
有没有办法让它只返回单个可观察模板,而不是包含一个项目的可观察模板数组?我对 rxjs 语法还很陌生,我不明白如何使用像reduce这样的东西。
这是我获取所有模板的工作方法。
getAllTemplates(): Observable<Template[]>{
const uri = this.baseService.rootTemplatesUri;
return this.http.get<Template[]>(uri)
.pipe(
catchError((error: HttpErrorResponse) => { return throwError(error); })
);
}
Run Code Online (Sandbox Code Playgroud)
这是我按名称过滤的尝试,如果存在匹配的名称,它将返回一个包含一个元素的数组:
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); })
);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法通过过滤返回单个 Observable?
当map使用 RxJS 运算符时,返回的 observable 具有运算符内部返回的类型map。JavaScriptfilter方法返回一个新数组,如其文档中所述。这就是为什么你的getTemplateByName方法返回一个可观察的Template[]元素。
如果需要使该getTemplateByName方法返回可观察的Template元素,则需要在运算符Template内返回单个元素map。JavaScript方法按照Array\xe2\x80\x8b.prototype\xe2\x80\x8b.find()find中所述执行此操作。只需使用它来实现所需的行为即可。
getTemplateByName(name:string):Observable<Template>{\n const uri = this.baseService.rootTemplatesUri;\n return this.http.get<Template[]>(uri)\n .pipe(\n map(templates => {\n return templates.find(template => {\n return template.Name === name;\n })\n }),\n catchError((error: HttpErrorResponse) => { return throwError(error); })\n );\n\n }\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
5281 次 |
| 最近记录: |