基本了解Angular Http

Basic understanding of Angular Http

我已经阅读了一些关于 Angular 的 Http 服务的文章,但我仍然无法理解一些事情:

  1. http.get('some/string/')return是什么意思?

  2. http.get('some/string/').mapreturn是什么意思?如果 map 不是 return http 请求的实际结果,我需要使用它做什么?

  3. 如何在不使用 map、observables、toPromise 等的情况下获得 http 请求的实际结果?

  4. 我可以只使用 Promise 而不使用 toPromise 吗?如果没有,我如何使用 toPromise 来获得 http 请求的实际结果?

我同意@Claies 的观点,你应该阅读文档,但是,我也能理解一开始可能有点困难。

Http.get() 调用将 return 一个您可以订阅的 Observable,以使其实际工作。

Observables 有 150~ 种方法,例如 map、flatMap、filter、scan 以及您可以将它们视为数组方法的其他方法。

当你调用这些方法中的每一个时,你得到的是另一个 observable,所以它是一个链:

   let firstThing = Observable
   let secondThing = firstThing.doSomething()
   let thirdThing  = secondThing.doSomethingElse()

可能是:

    let thirdThing =   firstThing.domeSomething().doSomethingElse();

这叫做链接,您在 JQuery 中也有它们:

element.find(blah).addClass(bllaah).removeClass().find() ....

最后但同样重要的是,所有可观察对象都是冷的(懒惰的),这意味着除非您订阅它们,否则整个链不会做任何事情。

话虽如此,

这不会 运行 doSomethingdoSomethingElse 直到有人订阅它们。

    let thirdThing =   firstThing.domeSomething().doSomethingElse();

所以要让 em 工作:

        thirdThing.subscribe(callback);

所以,如果不订阅它们,您将无法使用 http methods

1) http.get(url) returns 一个 Observable 可以与 none 或任何 RxJS 运算符一起使用(例如 map, filter 等 - 参见 RxJs docs)

编辑 - 从 Angular 4.3 开始,Http 模块假定 JSON 为默认值,因此不再需要 map(res=>res.json()) 调用!

2) http.get(url).map() 将 return 映射(转换)Observable,可能包装不同的类型,例如 Observable<string>。确切的类型取决于 map 调用中的函数。通常在 Angular 2/4 中,此函数用于使用 .json() 方法将响应映射到 javascript 对象:

this.http.get(url).map(response => response.json())

这会给你一个 Observable 包装 JS 对象,例如像 {user: 'Fred', balance: 65535}。 要实际 'use' 这个 object/response,你必须订阅 Observable,通常在调用组件中(尽管可能在服务中),并且在订阅回调中你可以用实际的响应数据做你想做的事,例如记录它,将它传递给其他函数,存储为 class 成员等:

http.get(url).map(res => res.json()).subscribe(resObject => {
   console.log(resObject);
   this.user = resObject.user;
   this.balance = resObject.balance;
});

只有当订阅被调用时,http 请求才会真正发出...这就是 Rx 的本质!

3) 你不能,你必须订阅 observable。来自 http 调用的响应本质上是异步的,不能简单地转换为同步代码——你不能只写,例如

this.user = http.get(url).fromObservable() 因为不能保证服务器已经响应并提供了一些可以在同步代码中转换和使用的东西。另外,这里一个observable的本质是,除非被订阅,否则observable不会做任何事情!

4) 你可以将 observable 转换为 promise(尽管我会避免它,除非你真的很喜欢 promises 因为 observable 更强大)并且如果你喜欢使用 .then...