Angular httpClient是否构造观察者?

Angular httpClient是否构造观察者?,angular,observable,Angular,Observable,在角度被说成是构造一个可观测的,我试图理解可观测的概念,所以如果它确实构造了一个可观测的,为什么要声明一个呢? 这让我很困惑,因为我有一个正在工作的项目,而编写代码的人使用一个服务从数据库获取或发布一些数据(使用http.get),他订阅了这个项目 this.http.post('apihere','formhere',{ headers: new Httpheaders().set("content-type","application/json") }).subscribe(data =&g

在角度被说成是构造一个可观测的,我试图理解可观测的概念,所以如果它确实构造了一个可观测的,为什么要声明一个呢? 这让我很困惑,因为我有一个正在工作的项目,而编写代码的人使用一个服务从数据库获取或发布一些数据(使用http.get),他订阅了这个项目

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:我并不是说订阅
是错误的