Angular 角度观测值

Angular 角度观测值,angular,rxjs,Angular,Rxjs,这可能是一个非常基本的问题,但我真的被困在这种情况下,似乎无法找到答案: 我正在对一些数据执行http GET请求。我必须在一个“组件”中显示这些数据,然后我必须“访问”这些数据(从http请求接收的数据) 所以我必须在两点存储这些数据。我会两次引用从HTTPGET请求返回的可观察对象吗?或者我必须订阅一次,将响应保存在某个地方,并从保存的数据中为我的两个用例(组件和访问)提供信息 如果我订阅两次,是否会有数据丢失的可能性,因为第一次订阅会触发HTTPGET,而第二次订阅“延迟” 如果这似乎含糊

这可能是一个非常基本的问题,但我真的被困在这种情况下,似乎无法找到答案:

我正在对一些数据执行http GET请求。我必须在一个“组件”中显示这些数据,然后我必须“访问”这些数据(从http请求接收的数据)

所以我必须在两点存储这些数据。我会两次引用从HTTPGET请求返回的可观察对象吗?或者我必须订阅一次,将响应保存在某个地方,并从保存的数据中为我的两个用例(组件和访问)提供信息

如果我订阅两次,是否会有数据丢失的可能性,因为第一次订阅会触发HTTPGET,而第二次订阅“延迟”

如果这似乎含糊不清,请让我知道,我会插入一些代码也

我正在使用@angular/core 7.0.0和rxjs 6.3.3

如果我订阅两次,是否会有数据丢失的可能性,因为第一次订阅会触发HTTPGET,而第二次订阅“延迟”

这取决于您的可观察对象是“热”还是“冷”。关于这个主题有很多参考资料。但基本上,hot是指多个订阅者共享一个可观察对象,cold是指为每个订阅者创建一个新的可观察对象

Angular's
httpClient.get
为您提供了一个可观察的cold。这意味着,每次订阅时,都会触发一个新的http请求

但是,将冷的观测值转换成热的观测值是非常容易的。您可以使用
share
操作符来执行此操作。例如:

this.httpClient.get("https://google.com").pipe(share())
但是,这将导致“延迟订户”错过通知。如果您有两个订阅者,并且希望他们都能得到保证的通知,您可以使用
shareReplay(1)

这将缓存最后一个通知,并将其发送给订阅服务器上的每个订阅服务器,确保只调用HTTP一次,每个订阅服务器都会得到一个结果

如果我订阅两次,是否会有数据丢失的可能性,因为第一次订阅会触发HTTPGET,而第二次订阅“延迟”

这取决于您的可观察对象是“热”还是“冷”。关于这个主题有很多参考资料。但基本上,hot是指多个订阅者共享一个可观察对象,cold是指为每个订阅者创建一个新的可观察对象

Angular's
httpClient.get
为您提供了一个可观察的cold。这意味着,每次订阅时,都会触发一个新的http请求

但是,将冷的观测值转换成热的观测值是非常容易的。您可以使用
share
操作符来执行此操作。例如:

this.httpClient.get("https://google.com").pipe(share())
但是,这将导致“延迟订户”错过通知。如果您有两个订阅者,并且希望他们都能得到保证的通知,您可以使用
shareReplay(1)


这将缓存最后一个通知,并在订阅时将其发送给每个订户,确保您只调用HTTP一次,每个订户都会得到一个结果。

您最好的选择是创建一个与HTTP调用关联的
行为主题。您可以使用一个函数启动HTTP调用,然后使用另一个函数订阅这些值。因此,如果您不想触发HTTP调用,您并不总是触发HTTP调用

例如:

...
// Service
private values: BehaviorSubject<any> = new BehaviorSubject<any>(null);

subscribeValues(): BehaviorSubject<number> {
    return this.values;
}

public getValues(): void {
    this.http.get(this.URL)
      .toPromise()
      .then(res => {
        this.values.next(res);
      });
}
...

BehaviorSubject
在您订阅时将始终发出它的最后一个(或初始)值。因此,当您从任何组件订阅时,您将获得最后一个值,并且可以从任何组件再次触发API,订阅的任何内容都将被更新。

您最好的选择是创建一个与HTTP调用关联的
行为子对象。您可以使用一个函数启动HTTP调用,然后使用另一个函数订阅这些值。因此,如果您不想触发HTTP调用,您并不总是触发HTTP调用

例如:

...
// Service
private values: BehaviorSubject<any> = new BehaviorSubject<any>(null);

subscribeValues(): BehaviorSubject<number> {
    return this.values;
}

public getValues(): void {
    this.http.get(this.URL)
      .toPromise()
      .then(res => {
        this.values.next(res);
      });
}
...

BehaviorSubject
在您订阅时将始终发出它的最后一个(或初始)值。因此,当您从任何组件订阅时,您将获得最后一个值,您可以从任何组件再次触发API,订阅的任何内容都将更新。

您的API数据会经常更改吗?它会改变吗?这取决于你的数据改变的频率,不是吗?此外,引用数据通常应该存储,因为它们不太可能经常更改API的数据会经常更改吗?它会改变吗?这取决于你的数据改变的频率,不是吗?此外,参考数据通常应该存储,因为它们不太可能经常更改。非常感谢您的澄清。非常感谢您的澄清。