【问题标题】:Angular 4/5 > httpclientmodule .get() chaining functions and return-data typesAngular 4/5 > httpclientmodule .get() 链接函数和返回数据类型
【发布时间】:2018-06-20 09:23:00
【问题描述】:

请查看两个答案。 (感谢 JLRishe 和 AngularInDepth.com)

AngularInDepth 还在他的帖子中添加了指向拦截器和 HttpClient 机制的有趣链接:

https://blog.angularindepth.com/insiders-guide-into-interceptors-and-httpclient-mechanics-in-angular-103fbdb397bf


使用 RxJS 和 HttpClientModule,当调用 .get()HttpClient 时,这个链中的返回值是什么?

constructor (private _http: HttpClient) {
...
this._http.get(url).map(res=>res.json()).toPromise()   // how does this chaining work?

据我了解,_http.get(url) 返回一个 observable,但我们将 .map() 链接到 .get() 方法。

我也猜测下面的.map() 作为接收http-response 对象,我们及时将其转换为json 对象。最后,整个 observable 被转换为带有 .toPromise() 的 promise,这似乎并不关心 .map().get() 所做的任何事情

  1. 到目前为止,我了解到_http.get() 返回一个 observable 并且还将提供 http-response 对象(作为下一个或回调函数)
  2. 是 .map() 函数,仅作用于响应对象,不会改变整个_http.get() 函数的返回类型。 (返回类型保持与可观察的相同)?我的假设是否正确?
  3. 一般来说,如果上述情况属实,那么 JS 是如何确定什么样的链函数会作用于回调数据,哪些会作用于返回类型呢?我们如何实现我自己的自定义函数,以便我的链函数严格处理回调数据(如果我使用正确的术语,请纠正我)或返回类型?
  4. 我们能否将.map() 添加到所有异步函数(promise、observables、callbacks)以处理它们的回调数据?同样,.toPromise() 是否适用于所有异步函数以将它们转换为 Promise?

【问题讨论】:

  • 对于.map,您使用的是Rx/rxjs吗?
  • 是的。感谢您指出。已添加到帖子中。

标签: javascript angular asynchronous promise angular5


【解决方案1】:

到目前为止,我了解 _http.get() 返回一个 observable 并将 还提供 http-response 对象(作为 next 或回调函数

request 方法的签名(get 内部调用的方法)是:

request(...): Observable<any>

这意味着它返回一个发出any 类型项目的可观察对象。它返回的值之一是HttpResponse。但是,根据observe 参数,它可以返回response.body 中的文本或JSON.parse(response.body) 中的解析JSON。

是 .map() 函数只作用于响应对象,不会 更改整个 _http.get() 函数的返回类型。 (返回类型 保持与可观察的相同)?我的假设正确吗?

map 对 observable 发出的值进行操作。并且函数签名没有明确指定这些类型,而是使用泛型类型any

我们可以将 .map() 添加到所有异步函数吗 (promise,observables,callbacks)

这里的map 特定于RxJs library。不是Array.prototype.map中的map

一般来说,如果上面是真的,那么 JS 是怎么算出来的 链接函数将对回调数据起作用,并且哪个起作用 关于返回类型?

你需要阅读 RxJs 操作符和 lettable 操作符here。 RxJs 将一个接一个地执行每个运算符。所有操作符都在处理 observable 发出的数据,对于 HttpClient,它是 HttpResponseresponse.bodyJSON

您可以在文章中的HttpClient 中阅读有关可观察链如何工作的更多信息:

【讨论】:

  • 感谢您的提示。 lettable 运算符的东西对我来说是新的,看起来像一个非常有用的工具
【解决方案2】:
  1. 到目前为止,我了解到 _http.get() 返回一个 observable 并且还将提供 http-response 对象(作为下一个或回调函数)

_http.get() 返回一个可观察的 of http-response 对象。您可以将可观察对象视为值流上的一个窗口,在这种情况下,该流将只是一个值(结果)

  1. 是 .map() 函数,只作用于响应对象,不会改变整个 _http.get() 函数的返回类型。

是的。它创建了一个 new 可观察对象,其中原始可观察对象的值已经以某种方式进行了转换。在本例中,该转换为res =&gt; res.json()

  1. 一般来说,如果上述情况属实,JS 是如何确定什么样的链函数会作用于回调数据,哪些会作用于返回类型呢?我们如何实现我自己的自定义函数,以便我的链函数严格处理回调数据(如果我使用正确的术语,请纠正我)或返回类型?

我真的不明白这个问题。传递给map 的函数需要将 observable 包含的类型作为输入,并产生某种类型作为输出。

  1. 我们能否将 .map() 添加到所有异步函数(promise、observables、callbacks)以处理它们的回调数据?同样,.toPromise() 是否适用于所有异步函数以将它们转换为 Promise?

您可以在任何 observable 上使用 .map(),也可以在任何 observable 上使用 .toPromise()。请记住,.toPromise() 为来自 observable 的 first 值创建了一个 promise,因此它通常适用于产生单个值的 observables(就像这个一样)。

【讨论】:

  • for (3) 我质疑返回类型的 Javascript 机制。由于某些原因,我认为 javascript 可以在不触及返回的 observable 的情况下以某种方式神奇地处理回调数据。但正如您在上面解释的那样,现在很明显.map() 正在修改回调数据并创建一个全新的 observable。
  • 另外,_http.get(url).map(response=&gt;response.json()) 中响应的正确术语是什么?我们可以称之为“回调数据”吗?除了说它会在回调中之外,它似乎不是很有见地。
  • @theMobDog 你可以称之为“结果值”。
猜你喜欢
  • 2018-02-07
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多