【问题标题】:Inspecting/Modifying RxJS Observable instance检查/修改 RxJS Observable 实例
【发布时间】:2021-07-19 08:34:15
【问题描述】:

我有以下打字稿方法

private processRequest<T>(request: Observable<T>, ...): Promise<T> {...}

request 是一个 HttpClient Observable

processRequest(httpClient.get(url, ...));
...
processRequest(httpClient.post(url, ...));
...
  • 是否可以在 processRequest 中检索 url?如果是怎么办?如果不是,为什么?
  • 是否可以在 processRequest 中更改 url?如果是怎么办?如果不是,为什么?

【问题讨论】:

  • 不,不。这听起来像是一个 XY 问题。
  • @IngoBürk 为什么不呢? XY问题是什么意思?
  • “为什么不呢?” ——因为这就是你两个问题的答案。
  • @IngoBürk - 问题改变了。另外,请澄清您对 XY 问题的含义。

标签: typescript rxjs observable angular-httpclient


【解决方案1】:

是否可以在 processRequest 中检索 url? [...] 如果不是,为什么?

一般意义上,在f(g(x))中,f不能访问x,因为它只能看到g返回的内容,而那个返回值根本不需要知道x .将g = u =&gt; 42 视为一个简单的函数示例,该函数不保留有关其输入的信息。

如果返回值保留该信息,它起作用。例如,对于g = u =&gt; u(身份函数),f 当然会知道x,因为这正是传递给它的内容。不过,这需要f 具备这些特定知识。

由于HttpClient#get 返回Observable,但这里不是这种情况。如果您考虑url 是特定于HttpClient 逻辑的信息,而Observable 源于对Angular 一无所知的RxJs,这可以直观地理解。更直接一点,只要检查Obervable的类型就可以看出。

是否可以在 processRequest 中更改 url? [...] 如果不是,为什么?

现在这很明显,但您无法更改无法访问的内容。

【讨论】:

  • Observable 不是函数,是对象。我们用它做的是调用方法,比如订阅,它使用内部状态来操作。在这种情况下,url 必须隐藏在 status 中的某个位置。实际上,我们可以为传出请求(在 Observable 创建后调用)提供一个拦截器,它接收完整的请求。这意味着该信息在对象中并且可以在某个级别访问。
  • 但是#get 是一个函数。无论如何,observables 比你想象的更接近函数。 URL 实际发生的情况是它在传递给 observable 的函数中被关闭。不,您无法访问它。如果你确信你可以,为什么要问这个问题?在这种情况下,只需在控制台中调试对象并找出它是哪个属性。
  • 拦截器,顺便说一下,可能是你没有问的问题的答案。但你问了一个非常具体的问题,答案是不可能的。
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2020-12-28
  • 2017-04-18
  • 1970-01-01
相关资源
最近更新 更多