我有一个 Angular 9 应用程序,大部分情况下使用 observables。在一个组件中,我需要:
- 获取所有公司(因为它们包含我需要的某些信息)
- 然后获取所有响应并映射公司中的一些额外信息(即响应的公司名称)。
- 将该列表作为 observabe 返回,该列表使用异步管道在模板中订阅。
为此,我最初有以下代码(似乎有效):
getPopulatedResponses(): Observable<ResponseModel[]> {
return this.companyFilesStore
.select(companyFilesSelector)
.pipe(
switchMap(companies => {
return this.getAccessibleResponses(companies);
})
)
}
getAccessibleResponses(accessibleCompanies: CompanyFilesModel[]): Observable<ResponseModel[]> {
return this.responsesStore
.select(responsesSelector)
.pipe(
map((responses) => {
return responses?.map((response) => {
const company = accessibleCompanies?.find(c => c.companyGuid === response.companyId);
response.companyName = company?.companyName;
return response;
}).sort((a, b) => {
return a.completedDateTime < b.completedDateTime ? 1 : -1;
})
})
)
首先,我不确定 switchMap 是否是正确的运营商,因为如果 companyFilesSelector 正在更新,然后responsesSelector 部分启动,那不会终止先前的订阅吗?
现在我还需要添加对我拥有的过滤器服务的订阅,因此我对 getAccessibleResponses 方法进行了以下更改(这似乎再次起作用,但我觉得它可能更多的是通过运气/良好的连接而不是任何东西别的):
getAccessibleResponses(
accessibleCompanies: CompanyFilesModel[],
): Observable<ResponseModel[]> {
return this.searchAndFilterService.getFilter()
.pipe(
switchMap(filter => {
return this.responsesStore
.select(responsesSelector)
.pipe(
map((responses) => {
return responses?.map((response) => {
const company = accessibleCompanies?.find(c => c.companyGuid === response.companyId);
response.companyName = company?.companyName;
return response;
})
?.filter(r => !r.isArchived)
?.filter(r => !filter?.selectedCompany || r.companyId === filter.selectedCompany.companyId)
?.filter(r => !filter.selectedAssessmentTemplate ||
r.assessmentTemplateId === filter.selectedAssessmentTemplate.assessmentTemplateId)
.sort((a, b) => {
return a.completedDateTime < b.completedDateTime ? 1 : -1;
})
})
)
})
)
}
我相当有信心这不是最好的,甚至不是正确的方法,但我有点迷茫,很难理解如何实现以下目标:
- 首先获取所有公司。
- 将可观察到的公司的结果与响应相结合。
- 当过滤器改变时(即过滤器服务 observable)过滤 1/2 的结果。
任何帮助或指导将不胜感激。