微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

异步方法上的 Angular 承诺处理装饰器

如何解决异步方法上的 Angular 承诺处理装饰器

我的应用程序中有很多地方需要以相同的方式处理失败的异步方法调用显示烤面包机并在控制台中记录错误。为此,我正在为 Angular 控制器方法编写一个装饰器。假设该方法一个异步函数,例如:

@ToastOnFail
async makeCall() {
  const result = await this.httpService.makeSomeRequest();
  // do stuff with the result
}

我的装饰器看起来像这样

export default async function ToastOnFail(
  target: any,propertyKey: string,descriptor: PropertyDescriptor
) {
  const originalMethod = descriptor.value;
  descriptor.value = function (...args) {
    const toasterService = AppModule.injector.get<ToasterService>(
      ToasterService as Type<ToasterService>
    );
    return originalMethod.apply(this,args)
      .catch((err) => {
        toasterService.addGenericActionIncompleteError();
        console.error(err);
      });
  };
}

出现编译错误

错误 TS1241:作为表达式调用时,无法解析方法装饰器的签名。 类型 'Promise' 与类型 'TypedPropertyDescriptor Promise>' 没有相同的属性

我不确定是否是 TS 混淆,我必须进行一些手动转换,或者如果我没有返回我应该从装饰器返回的内容。我错过了什么?

解决方法

免责声明这不是您问题的答案

为什么不使用“自定义运算符”? here 有一个关于自定义运算符的很好的链接。通过这种方式,您可以对 observable 进行“操作”

有些喜欢

function debug<T>(toasterService:ToasterService) {
  return function<T>(source: Observable<T>): Observable<T> {
    return source.pipe(catchError((err:any)=>{
      toasterService.addGenericActionIncompleteError()
      return throwError(err) //or return of(null)
    }));
  };
}

允许你写

const result = this.httpService.makeSomeRequest().pipe(debug(this.myToaster));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。