RxJs - (为什么)可观察对象是否会在新订阅时发出它的最新值?



好的,这是一个快速的,我已经有点累了,我自己也很困惑:D

我正在使用angular2和RxJS的observable。

我有一个带有属性"data"的服务,它是一个在构造函数中设置的可观察对象,还有一个返回这个可观察对象的方法来订阅。

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
    }
}

我不久前使用了replaySubjects,总是将序列的所有值发送给新的订阅者。然而,在上面的代码中,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的结果。获取,并向所有订阅者交付相同的值,而不是为每个订阅发出新的HTTP请求(返回HTTP . Get (url)..)。在getData ())

我知道这个问题有点老了,但是答案似乎让我很困惑。

你从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的参数是初始值。有了这两个运营商,请求将在第一个用户到达时发出。下一步订阅者将得到缓存的答案。

在其他回答中也有人建议使用Subjects。publishBehavior在底层使用主题。但是直接调用next()被认为是不好的做法,除非没有其他补救措施,在我看来,这不是这种情况。即使你直接使用subject,使用#asObservable()操作符将一个Observable返回给组件也是明智的,这样组件就不会访问next、error和complete方法。

No。你需要用Subject。它有一个方法next(),您可以将新到达的属性发送给该方法,以便它将其推送给订阅者。

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

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

最新更新