Angular httpClient是否构造观察者?
在角度被说成是构造一个可观测的,我试图理解可观测的概念,所以如果它确实构造了一个可观测的,为什么要声明一个呢? 这让我很困惑,因为我有一个正在工作的项目,而编写代码的人使用一个服务从数据库获取或发布一些数据(使用http.get),他订阅了这个项目Angular httpClient是否构造观察者?,angular,observable,Angular,Observable,在角度被说成是构造一个可观测的,我试图理解可观测的概念,所以如果它确实构造了一个可观测的,为什么要声明一个呢? 这让我很困惑,因为我有一个正在工作的项目,而编写代码的人使用一个服务从数据库获取或发布一些数据(使用http.get),他订阅了这个项目 this.http.post('apihere','formhere',{ headers: new Httpheaders().set("content-type","application/json") }).subscribe(data =&g
this.http.post('apihere','formhere',{
headers: new Httpheaders().set("content-type","application/json")
}).subscribe(data =>{//some stuff here})
我不明白的事情:为什么他不声明一个观察者,我可以使用一个服务并订阅而不定义一个观察者吗?是的,你可以直接订阅 从这里的文档: Subscribe操作符是将观察者连接到对象的粘合剂 可见的。为了让观察者看到 一个可观察的,或接收来自 可观察的,它必须首先用这个 接线员 Subscribe操作符的典型实现可以接受一对一 三种方法(然后构成观察者),或者它可以接受 实现的对象(有时称为观察者或订阅者) 包括这三种方法的接口: 在本例中:
this.productService.getProduct(id)
.subscribe(
(product: Product) => this.displayProduct(product),
(error: any) => this.errorMessage = <any>error
);
this.productService.getProduct(id)
.订阅(
(产品:产品)=>此.displayProduct(产品),
(error:any)=>this.errorMessage=错误
);
传递到subscribe的两个方法构成了观察者。是的,您可以直接订阅 从这里的文档: Subscribe操作符是将观察者连接到对象的粘合剂 可见的。为了让观察者看到 一个可观察的,或接收来自 可观察的,它必须首先用这个 接线员 Subscribe操作符的典型实现可以接受一对一 三种方法(然后构成观察者),或者它可以接受 实现的对象(有时称为观察者或订阅者) 包括这三种方法的接口: 在本例中:
this.productService.getProduct(id)
.subscribe(
(product: Product) => this.displayProduct(product),
(error: any) => this.errorMessage = <any>error
);
this.productService.getProduct(id)
.订阅(
(产品:产品)=>此.displayProduct(产品),
(error:any)=>this.errorMessage=错误
);
传递到subscribe的两个方法构成了观察者。是的,您可以
根据文件:
HttpClient是一个可注入类,具有执行HTTP请求的方法。每个请求方法都有多个签名,返回类型根据调用哪个签名(主要是observe和responseType的值)而变化
但若你们看一下Post方法,它确实返回了一个可观察的对象,HttpStream,ArrayBuffer等等
您只需定义您的服务方法,并在组件
类中订阅相同的服务方法即可。
例:
服务类
submitRequest(requestObj: any) {
return this.httpClient.post(`my-url`, requestObj)
.map(//do something);
}
在组件类中,只需订阅您的服务:
myService.submitRequest(requestObj).subscribe( (response) => {
//do something with response
});
是的,你可以
根据文件:
HttpClient是一个可注入类,具有执行HTTP请求的方法。每个请求方法都有多个签名,返回类型根据调用哪个签名(主要是observe和responseType的值)而变化
但若你们看一下Post方法,它确实返回了一个可观察的对象,HttpStream,ArrayBuffer等等
您只需定义您的服务方法,并在组件
类中订阅相同的服务方法即可。
例:
服务类
submitRequest(requestObj: any) {
return this.httpClient.post(`my-url`, requestObj)
.map(//do something);
}
在组件类中,只需订阅您的服务:
myService.submitRequest(requestObj).subscribe( (response) => {
//do something with response
});
首先,让我们试着理解可观察者和观察者之间的区别: 你似乎在交替使用观察者和可观察者这两个术语,我认为这不是正确的做法 由此: 可观察的:只是一个函数,具有一些特殊特征。它们是,它接收一个“观察者”(对象上有“
next
”、“error
”和“complete
”方法),并返回取消逻辑。在RxJS中,它是一个订阅对象,上面有一个unsubscribe方法
观察者是我们传递到.subscribe()
中的对象文本(subscribe将调用我们的可观察对象)
现在,让我们看看Angular StyleGuide是怎么说的: 现在,这一困惑已经消除,让我们来谈谈他们所说的 它强调: 将单一责任原则(SRP)应用于所有组件、服务和其他符号。这有助于使应用程序更干净,更易于阅读和维护,更易于测试 单一责任原则的本质是,我们编写的每一段代码都必须负责一项任务,并且只负责一项任务 对于组件:这意味着其职责是接受用户输入并向用户显示一些输出。现在,它作为一个输出到底显示了什么,它对输入到底做了什么,这并不是它的责任 对于服务:这意味着责任只是从组件获取输入并对其进行处理。它的职责还包括接触外部资源,获取组件需要在视图上显示的数据
回到您的示例: 理想情况下,从HttpClient上的任何方法接收到的任何内容通常都会按原样或在
map
ping之后返回到组件。因此,subscribe
ing在服务方法中的权利没有多大意义,应该被视为一种反模式
因此,您的服务可以按如下方式重构:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable()
export class DataService {
constructor(private http: HttpClient) {}
...
postData(formData) {
return this.http.post('API', formData);
}
}
import { Component } from '@angular/core';
import { DataService } from './data.service';
@Component({...})
export class YourComponent {
constructor(private dataService: DataService) {}
...
postData(formData) {
this.dataService.postData(formData)
.subscribe(response => /* DO SOMETHING WITH THE RESPONSE */);
}
}
此服务可在您的组件中使用,如下所示:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable()
export class DataService {
constructor(private http: HttpClient) {}
...
postData(formData) {
return this.http.post('API', formData);
}
}
import { Component } from '@angular/core';
import { DataService } from './data.service';
@Component({...})
export class YourComponent {
constructor(private dataService: DataService) {}
...
postData(formData) {
this.dataService.postData(formData)
.subscribe(response => /* DO SOMETHING WITH THE RESPONSE */);
}
}
PS:我并不是说订阅
是错误的