angular - Typescript 使用管道和清理转换 forkJoin 结果
问题描述
转换forkJoin ()结果的最佳方法是什么,所以在subscribe () 方法中我可以写如下内容:
this.refreshGraph(dependencies,microservices);
这是它现在的工作方式:
loadAll(): void {
const dependencies = this.dependencyService.query();
const microservices = this.microserviceService.query();
forkJoin({dependencies, microservices})
.subscribe(results => {
this.refreshGraph(results.dependencies.body || [], results.microservices.body || []);
});
}
refreshGraph(dependencies: IDependency[], microservices: IMicroservice[]): void {
...
}
我是否需要存储forkJoin () 的结果。订阅中的订阅()并在组件被销毁时手动取消订阅?在我的例子中, dependencyService和microserviceService只是包装http:
query(req?: any): Observable<EntityArrayResponseType> {
const options = createRequestOption(req);
return this.http.get<IDependency[]>(this.resourceUrl, { params: options, observe: 'response' });
}
完整的源代码可在此处获得
解决方案
这只是一点点重构。您可以在query()
方法内部转换数据,也可以在方法内部进行loadAll()
。
以下是您可以重写loadAll()
方法的一种方式。
loadAll(): void {
const dependencies = this.dependencyService.query().pipe(map(result => result.body || []));
const microservices = this.microserviceService.query().pipe(map(result => result.body || []));;
forkJoin({dependencies, microservices}).subscribe(
({dependencies, microservices}) => this.refreshGraph(dependencies,microservices)
);
}
请记住,如果提供给 forkJoin 的任何内部 observables 出现错误,您将失去任何其他已经完成或已经完成的 observables 的值。所以最好正确处理错误。您可以捕获错误并像这样返回一个空数组。
const dependencies = this.dependencyService.query().pipe(
map(result => result.body || []),
catchError(() => of ([]))
);
const microservices = this.microserviceService.query().pipe(
map(result => result.body || []),
catchError(() => of ([]))
);
而且你也不需要在这里手动取消订阅,因为 observable 是由 Angular 的 httpClient 服务创建的。看到这个帖子。一旦所有内部可观察对象完成,forkJoin 将自动完成。我希望这将有所帮助。
推荐阅读
- qt - 为什么动态组件创建中的属性绑定不起作用?
- sql - 连接3个表-SQL
- javascript - Material ui InputBase 不能被其他元素隐藏
- python - 在一个单元格之后删除所有单元格
- c++ - GCC 和 Clang printf 格式检查不适用于模板函数中的 decltype
- android - 发布到 Google Play 商店后,MissingPluginException(在通道 plugins.flutter.io/google_sign_in 上找不到方法 init 的实现)
- java - 按需要在 JDBC 中创建的顺序对外键关系进行排序
- azure - 使用 Azure AD 进行身份验证时 Blazor 服务器应用程序中的匿名页面
- python - 如何通过 API 重置 Google Sheet 的颜色
- python - 我可以将 requests.py 用于 Twitch API 吗?