没有可观察对象的服务

Service without observables

我很难理解,为什么我需要使用 observable。 我有一个非常简单的商店,如下所示

@Injectable({
  providedIn: 'root'
})
export class DataService {   

  private readonly personData: Person   = new Person();
  constructor() {
  }

  public getPerson():Person{
    return this.personData;
  }    
  public setAge(age:number){
    this.personData.age = age;
  }
}

如果我使用 observable

,上述服务工作得很好并且完全一样
@Injectable({
  providedIn: 'root'
})
export class DataService {

  // @ts-ignore
  private readonly personData: BehaviorSubject<Person> = new BehaviorSubject<Person>({});

  public personData$: Observable<Person> ;

  constructor() {
    this.personData$ = this.personData.asObservable();
  }

  public getPerson():Person{
    return this.personData.getValue();
  }

  public setAge(age:number){
    this.getPerson().age = number;
  }
}

我的问题是,为什么我要使用 observable,简单的服务 属性 工作得很好! 或者我错过了大局!请帮助我理解。

Observables 支持在应用程序的各个部分之间传递消息。它们在 Angular 中经常使用,并且是事件处理、异步编程和处理多值的推荐技术。

为了进一步理解,这将有助于https://angular.io/guide/observables

  1. 服务是关于如何将数据放入组件以及如何使用或呈现数据的抽象。
  2. 通常服务可能会通过向后端发出 http 请求来获取数据(此处为人员数据)。
  3. 在这种情况下,数据不会立即可供同步使用。这是异步 observable 介入的地方。您向后端发出 http 请求以获取数据,return 这个 observable 将被组件订阅并在数据可用时使用。
  4. 考虑另一个场景,其中人员数据的值不断变化,您需要相应地更新视图。要使这项工作同步进行,您可能必须轮询人员数据,如果发生更改,则更新视图(不好)。考虑使用 observable,这里 angular 将检测 observable 何时发出值并更新视图!!!
  5. 从多个组件从此服务方法获取数据的角度考虑第 4 点
  6. 别忘了查看 async pipe 个 angular

当你想与多个组件共享相同的数据时,Observables 很有用,因为它们都可以订阅相同的源并不断获取最新的更新数据。对于基本用例,这似乎没有用,但在大型项目中肯定有用。

它们在使用 OnPush 检测策略优化 angular 的变化检测时也非常有用。可观察对象可以告诉视图它已更新,因此视图也应该更新。 Async pipe

因此,如果您没有使用 OnPush 检测策略,或者您的项目的功能非常基础,您可能真的不需要 observables,但因为它们非常有用,老实说,有点难用,如果只是为了学习,我会说无论如何都要使用它们。它们为您提供了一种思考事物的新方式。 查找“响应式编程”。

在您的情况下,Observables 不是必需的,因为您正在 returning 一个 本地初始化的 变量并且 没有异步 操作发生。 但是,大部分时间服务 return 从 API.

获取的数据

假设您有一个 Angular 组件,它在单击按钮时显示来自 API 的一些 returned 数据。

您将单击该按钮并调用 getPersonFromAPI() 函数。

该函数将对 API 进行 Http 请求。但是等一下,当我们不使用 Observables 时,调用者会立即期待数据。但是函数 getPersonFromAPI() 不能立即 return 它们,因为它会 等待 来自 API 的响应。 所以我们正在等待 完成

当我们return Observable 通知来电者,嘿,请稍候!现在有事情发生了。如果您想在我完成时得到通知,请订阅我,我会在收到数据后立即通知您。