如何为RxJS map()的参数函数封装通用异常捕获包装器?
如何为Angular响应式表单脏检查的转换函数添加通用异常捕获包装器
我现在有一个用于Angular响应式表单脏检查的工具方法:
private checkIsDirty(valueChanges: Observable<any>, sourceEntity: any, createEntityFromFormValue: (frmVal: any) => unknown): Observable<boolean> { return valueChanges.pipe( debounceTime(400), distinctUntilChanged(), map(createEntityFromFormValue), // 这里调用转换函数 map((frmEntity) => !deepEqualRelaxed(sourceEntity, frmEntity)), startWith(false), shareReplay() ); }
还有一个典型的表单值转实体的函数,里面包含了重复的try-catch异常处理:
protected createEntityFromFormValue(frmVal: any): unknown { try { if (areAllPropsFalsy(frmVal)) { // 所有属性都为假值时返回undefined return undefined; } return new MyCompany( frmVal.name ?? "", frmVal.shortName ?? "", frmVal.phone ?? "", frmVal.email ?? "", this.company ? this.company.printingMml : true, frmVal.licenseNumber, frmVal.licenseExpDate, this.company ? this.company.id : undefined, frmVal.comment ); } catch (e: unknown) { console.error(`createCompanyFromValue exception: ${e}`); throw e; } }
我希望把这种异常捕获逻辑抽成一个通用的包装函数,在checkIsDirty里直接使用包装后的createEntityFromFormValue,避免在每个转换函数里重复编写try-catch(还可能遗漏)。需要特别说明的是,包装这个转换函数非常关键——因为Angular/RxJS会静默吞掉异常,导致问题极难排查!
内容的提问来源于stack exchange,提问作者AlexB
相关产品推荐
相关产品推荐

