You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:45:54