【问题标题】:Service without observables没有可观察的服务
【发布时间】:2020-08-09 01:42:35
【问题描述】:

我很难理解,为什么我需要使用 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,因为数据立即可用。当您不知道数据何时返回时使用 Observables。
  • 想象一个场景,当你的 Person 的值发生变化时,你想做一些事情,在这种情况下,使用 Observable 变得很有用,因为你可以注册回调(订阅)并且每当你得到一个新的 Person值您的回调可以执行,它允许您监听更改事件并对它们做出反应(在您的示例中,它没有任何区别,因为您从不调用 this.personData.next(value)

标签: angular rxjs observable rxjs-observables


【解决方案1】:

当您想与多个组件共享相同的数据时,Observable 非常有用,因为它们都可以订阅相同的源并不断获取最新更新的数据。对于基本用例,这可能看起来没什么用,但在大型项目中确实有用。

在使用OnPush 检测策略优化 angular 的变化检测时,它们也非常有用。一个 observable 可以告诉视图它已经被更新,所以视图也应该被更新。 Async pipe

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

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

      【讨论】:

        【解决方案4】:

        在您的情况下,Observables 不是必需的,因为您正在返回 本地初始化 变量并且没有发生异步操作。 但是,大多数时候服务返回从 API 获取的数据。

        假设你有一个 Angular 组件,当点击一个按钮时,它会显示一些从 API 返回的数据。

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

        该函数将对 API 进行 Http 请求。但是等等,当我们不使用Observables 时,调用者会立即期待数据。但是函数getPersonFromAPI() 不能立即返回它们,因为它会WAIT 等待来自API 的响应。 因此,我们正在WAITINGDONE

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

        【讨论】:

          猜你喜欢
          • 2017-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-06
          相关资源
          最近更新 更多