【问题标题】:How can I call an angular service from within a custom rxjs operator?如何从自定义 rxjs 运算符中调用角度服务?
【发布时间】:2019-06-28 10:17:50
【问题描述】:

我正在编写一个自定义 rxjs 运算符来处理记录 HttpClient 响应错误。我的直觉是将自定义运算符放在自己的文件中,我会在需要的地方包含它。但是,这使它脱离了“Angular 世界”,那么它如何访问我的 Angular 日志服务呢?

【问题讨论】:

  • 为什么不使用拦截器来记录 HttpClient 中的错误?还是要添加条件错误日志记录。
  • 是的,它需要比拦截器提供的更多上下文。例如,如果它重试并成功,我不希望它记录。或者,如果一个 API 调用失败,但第二个 API 调用检索到数据。
  • 您可能会尝试破解它并让拦截器功能成为服务类的一部分。这样,您可以在操作员服务中注入日志服务,但也需要您在使用它的任何地方注入实际的操作员。此外,this 可能无法在运算符内部正确绑定,除非您以 ES6 方法的方式执行它:operator: () => {} 而不是 operator() {}。这只是我想到的一个黑客。不确定它是否正确或有帮助。

标签: angular rxjs


【解决方案1】:

拦截器是一种可能的解决方案。另一种选择是创建自己喜欢的 http 服务

class Http{
   constructor(private http:HttpClient){}
   logging = (res)=>tap(res=>log(res))
   preIntercept(options)=>options
   post(options){ 
      options=preIntercept(options)
      return http.post(options).pipe(logging)
   } 
}

它只是为您提供了更多的灵活性,并且代码更加明确。使用默认拦截器,您将遇到很多if else 案例,因为每个 http 调用都经过这个集中式集线器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 2022-01-14
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多