angular - 具有可观察值更改的 Angular 最佳实践
问题描述
在我们当前的项目中,我们使用 Observable,如果值发生变化,我们必须进行其他 api 调用。例如像这样的东西(authorizedModules$
是一个可观察的):
ngOnInit(): void {
this.authorizedModules$
.pipe(
takeUntil(this.onDestroy$),
switchMap(async () => this.load())
).subscribe();
}
async load(): Promise<void> {
const foo: boolean = await this.fooService.isFoo().toPromise();
if (!foo) {
return;
}
const fooA: Foo[] = await this.authorizedModules$.pipe(take(1)).toPromise();
if (!fooA || fooA.length === 0) {
return;
}
this.fooB = await this.fooService.getFoo(fooA);
....
}
我不确定这是否是一种反模式,或者至少是一个好的解决方案,因为我们混合了 Observables 和 Promises。那么处理这样的事情的最佳方法是什么?
解决方案
我想说没有必要将 observables 转换为 Promise。您可以使用高阶映射运算符(如concatMap
)从一个可观察对象映射到另一个对象,并仅在满足特定条件时使用filter
运算符继续。
尝试以下
ngOnInit(): void {
this.authorizedModules$.pipe(
concatMap(() => this.fooService.isFoo()),
filter(foo => !!foo),
concatMap(() => this.authorizedModules$.pipe(take(1))),
filter(fooA => !!fooA && fooA.length != 0),
concatMap(fooA => this.fooService.getFoo(fooA)),
takeUntil(this.onDestroy$),
).subscribe({
next: (res: any) => {
// handle response
},
error: (error: any) => {
// handle error
}
});
}
推荐阅读
- python - 在 SNMP 代理端动态增加 OID
- swift - 如何快速隐藏状态栏?
- python - “tensorflow/core/platform/posix/subprocess.cc:208] 无法启动 fork() 子进程:无法分配内存”
- javascript - 在javascript中将函数转换为类-“this”和私有函数的问题
- intellij-idea - 在其他项目中实现符号是否意味着去其源代码?
- .net - 无法在 Visual Studio 2017 中禁用 IOException 中断
- excel - 如何在睡前更新图像?
- android - 将数据从firebase加载到android recyclerview
- javascript - 导入.md文件错误渲染vue模板
- php - 磅号在发送的电子邮件中显示为“」”符号,标题元标记为 charset=utf-8