Angular 对Http的基本理解
我读过一些关于Angular的Angular 对Http的基本理解,angular,promise,observable,angular-http,Angular,Promise,Observable,Angular Http,我读过一些关于Angular的Http服务的文章,但我仍然不能理解一些事情: http.get('some/string/')返回什么 http.get('some/string/').map返回什么?如果map没有返回http请求的实际结果,我需要使用它做什么 如果不使用map、observatives、toPromise等,如何获得http请求的实际结果 我可以不使用Promises而直接使用toPromise吗?如果没有,我如何使用toPromise获得http请求的实际结果 我同意@Cl
Http
服务的文章,但我仍然不能理解一些事情:
map
没有返回http
请求的实际结果,我需要使用它做什么map
、observatives、toPromise
等,如何获得http
请求的实际结果Promise
s而直接使用toPromise
吗?如果没有,我如何使用toPromise
获得http
请求的实际结果我同意@Claies的观点,你应该阅读文档,但是,我也能理解一开始可能有点困难
Http.get()
Observables有150种方法,比如map、flatMap、filter、scan等等,你可以把它们看作是数组方法
当你调用这些方法中的每一个时,你得到的是另一个可观察的,因此它是一个链:
let firstThing = Observable
let secondThing = firstThing.doSomething()
let thirdThing = secondThing.doSomethingElse()
可以是:
let thirdThing = firstThing.domeSomething().doSomethingElse();
这叫做链接,在JQuery中也有:
element.find(blah).addClass(bllaah).removeClass().find() ....
最后但并非最不重要的一点是,所有的可观察对象都是冷的(懒惰的),这意味着除非您订阅它们,否则整个链都不会做任何事情
话虽如此
在有人订阅之前,这不会运行doSomething
和doSomethingElse
let thirdThing = firstThing.domeSomething().doSomethingElse();
因此,要使em发挥作用:
thirdThing.subscribe(callback);
因此,如果不订阅http方法,您就不能使用http方法。我同意@Claies的观点,即您应该阅读文档,但是,我也可以理解,一开始可能有点困难
Http.get()
Observables有150种方法,比如map、flatMap、filter、scan等等,你可以把它们看作是数组方法
当你调用这些方法中的每一个时,你得到的是另一个可观察的,因此它是一个链:
let firstThing = Observable
let secondThing = firstThing.doSomething()
let thirdThing = secondThing.doSomethingElse()
可以是:
let thirdThing = firstThing.domeSomething().doSomethingElse();
这叫做链接,在JQuery中也有:
element.find(blah).addClass(bllaah).removeClass().find() ....
最后但并非最不重要的一点是,所有的可观察对象都是冷的(懒惰的),这意味着除非您订阅它们,否则整个链都不会做任何事情
话虽如此
在有人订阅之前,这不会运行doSomething
和doSomethingElse
let thirdThing = firstThing.domeSomething().doSomethingElse();
因此,要使em发挥作用:
thirdThing.subscribe(callback);
因此,如果不订阅,就不能使用http方法。1)http.get(url)
返回一个可观察的,您可以不使用或使用任何RxJS操作符(例如map
,filter
等-请参阅)
EDIT-从Angular 4.3开始,Http模块假定JSON为deafult,因此不再需要map(res=>res.JSON())调用强>
2) http.get(url).map()
将返回一个映射的(转换的)Observable
,可能会包装一个不同的类型,例如Observable
。确切的类型取决于map
调用中的函数。通常在Angular 2/4中,此函数用于使用.json()
方法将响应映射到javascript对象:
this.http.get(url.map)(response=>response.json())
这将为您提供一个可观察的
包装JS对象,例如
{用户:'Fred',余额:65535}
。
要实际“使用”此对象/响应,您必须订阅可观察对象,通常在调用组件中(尽管可能在服务中),并且在订阅回调中,您可以对实际响应数据执行您想要的操作,例如记录它、将它传递给其他函数、存储为类成员等:
http.get(url).map(res => res.json()).subscribe(resObject => {
console.log(resObject);
this.user = resObject.user;
this.balance = resObject.balance;
});
只有在调用subscribe时,才会实际发出http请求。。。这就是Rx的本质
3) 你不能,你必须订阅可观察的。http调用的响应本质上是异步的,不能简单地在同步代码中转换——你不能只写,例如
this.user=http.get(url).fromObservable()
,因为不能保证服务器已经响应并提供了一些可在同步代码中转换和使用的内容。此外,这里的可观察对象的性质是,除非它被订阅,否则可观察对象不会做任何事情
4) 您可以将一个可观察的转换为承诺(尽管我会避免它,除非您确实喜欢承诺,因为可观察的功能更强大),并使用。然后如果您喜欢…1)http.get(url)
返回一个可观察的
,您可以不使用或使用任何RxJS操作符(例如map
,filter
等-参见)
EDIT-从Angular 4.3开始,Http模块假定JSON为deafult,因此不再需要map(res=>res.JSON())调用!
2) http.get(url).map()
将返回一个映射的(转换的)Observable
,可能会包装一个不同的类型,例如Observable
。确切的类型取决于map
调用中的函数。通常在Angular 2/4中,此函数用于使用.json()
方法将响应映射到javascript对象:
this.http.get(url.map)(response=>response.json())
这将为您提供一个可观察的
包装JS对象,例如
{用户:'Fred',余额:65535}
。
要实际“使用”此对象/响应,您必须订阅可观察对象,通常在调用组件中(尽管可能在服务中),并且在订阅回调中,您可以对实际响应数据执行您想要的操作,例如记录它、将它传递给其他函数、存储为类成员等:
http.get(url).map(res => res.json()).subscribe(resObject => {
console.log(resObject);
this.user = resObject.user;
this.balance = resObject.balance;
});
只有在调用subscribe时,才会实际发出http请求。。。这就是Rx的本质<