首页 文章

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

提问于
浏览
0

好吧,这是一个快速的,我已经筋疲力尽了,让自己感到困惑: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似乎向新用户发出了它的最新 Value . 这是有意的吗?

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

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

2 回答

  • 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,这样组件就无法访问下一个,错误和完整的方法 .

  • 0

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

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

    此外,不是在构造函数中实例化您的数据,而是实现 OnInit 并从那里执行对服务器的调用 .

相关问题