无需订阅即可使用Observable?Angular服务代码疑问
为什么Angular服务中返回Observable无需订阅也不报错?
你产生疑惑的核心是没分清「Observable对象的定义/返回」和「Observable的执行」这两个环节:
- 你在服务里写的
getUsers()和addUser(),只是创建并返回了一个Observable实例,并没有触发这个Observable对应的逻辑(也就是HTTP请求)。HttpClient返回的Observable属于「冷Observable」——这类Observable只有在被调用.subscribe()方法时,才会真正发起请求、执行数据流。 - 服务的作用就是封装数据请求逻辑,把Observable交给调用它的组件或其他服务,由调用方去订阅来启动请求、处理响应数据。你现在只是定义了这个Observable,没有触发执行,自然不会报错——毕竟错误只会在执行环节出现,比如没订阅导致请求没发起,但你连发起的动作都没触发,当然不会有问题。
- 打个比方:这就像你写了一个函数,里面定义了要做的事,但你没调用这个函数,那函数里的逻辑根本不会跑,自然不会有错误。返回Observable就相当于返回这个“待执行的函数”,订阅才是调用它。
你的服务代码如下:
import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { User } from '../models/user'; const httpOptions = { headers: new HttpHeaders({'content-Type': 'application/json'}) } @Injectable({ providedIn: 'root' }) export class UserService { BASE_URL: string = 'http://localhost:3000/'; constructor(private segurancaHttp: HttpClient) { } getUsers(): Observable<User[]>{ return this.segurancaHttp.get<User[]>(this.BASE_URL + 'users') } addUser(user:any): Observable<User>{ return this.segurancaHttp.post<User>(this.BASE_URL + 'users', user, httpOptions) }
内容的提问来源于stack exchange,提问作者vinudev
相关产品推荐
相关产品推荐

