RxJs - (为什么)Observable是否会在新的替换上发出它的最新值?

时间:2016-09-21 13:50:06

标签: javascript angular rxjs observable

好的,这是一个快速的,我已经筋疲力尽了,让自己感到困惑:D

我正在使用angular2和RxJS Observables。

我有一个带有属性“data”的服务,它是一个在构造函数中设置的Observable,以及一个返回此observable以进行订阅的方法。

export class test{
    private data: Observable<Object>
    constructor(private http: Http){
       this.data = this.http.get(url).map( res => res.json());
    }  
    getData(): Observable<Object>{
       return this.data
    }
}

前一段时间我曾经使用过者重播主题,以便始终向新订阅者发出序列的所有值。但是,使用上面的代码,Observable似乎向新用户发出了它的最新价值。这是为了吗?

test(i: number) {
      if (i > 0) {
        setTimeout( () => {
          this.dataService.getData().subscribe( (data) => {
            this.debug.log(data);
            this.test(i-1);
          });
        }, 2000);
      }
    }
test(4)

我得到每次迭代的值。我很困惑,因为一年前当我想要这种行为时,我订阅'太晚'时没有新的价值观。 本质上,我只想缓存http.get的结果,并向所有订阅者提供相同的值,而不是为每个订阅创建一个新的http请求(在getData()中返回http.get(url)..)

2 个答案:

答案 0 :(得分:1)

我知道这个问题有点陈旧,但答案在我看来很混乱。

从方法getData()返回的Observable只是一个Observable。因此,每次消费者订阅它都会获得响应。所以它工作正常,但它确实每次都会提出新的请求。

为了缓存结果,有很多方法可以根据您想要的行为来实现。要仅缓存单个请求,我建议使用#publishBehavior运算符:

export class test{
  private data: Observable<Object>;
  constructor(private http: Http){
    this.data = this.http.get(url)
      .map(res => res.json())
      .publishBehavior([])
      .refCount();
  }  
  getData(): Observable<Object>{
    return this.data;
  }
}

传递给publishBehavior的参数是初始值。有了这两个运营商,将在第一个用户到达时提出请求。下一个订阅者将获得缓存的答案。

在其他答案中,建议使用受试者。 publishBehavior正在使用主题。但是要直接调用next(),除非没有其他补救措施,否则考虑不好的做法,在我看来,情况并非如此。即使您直接使用Subject,也可以使用#asObservable()运算符将Observable返回到Components,这样组件就无法访问下一个,错误和完整的方法。

答案 1 :(得分:0)

没有。您需要使用Subject。它有一个方法next(),您将向其发送新到达的财产,以便将其推送给订阅者。

除此之外,您还应该创建一个单身的服务。每当组件在构造函数中实例化它时,它们将接收已经形成的具有所有数据的对象。每次都不需要获取数据。

此外,不是在构造函数中实例化数据,而是实现OnInit并从那里调用服务器。