当前位置: 首页 > 知识库问答 >
问题:

RxJs-(为什么)一个可观测的发射它的最新值在一个新的替代?

有耀
2023-03-14

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

我正在使用angular2和RxJS观测设备。

我有一个带有属性“数据”的服务,这是一个在构造函数中设置的可观察对象,以及一个返回此可观察对象以订阅的方法。

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

前一段时间,我曾与replaySubject合作,总是向新订阅者发出序列的所有值。然而,通过上面的代码,可观测的似乎向新用户发出了它的最新值。这是有意的吗?

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请求(返回getData()中的http.get(url)…)

共有2个答案

暴奕
2023-03-14

否。您需要为此使用主题。它有一个方法next(),您将向该方法发送新到达的属性,以便将其推送到订阅者。

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

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

司马高昂
2023-03-14

我知道这个问题有点老了,但答案在我看来相当混乱。

从getData()方法返回的可观测值就是一个可观测值。所以每次消费者订阅都会得到回应。所以它工作得很好,但它确实每次都提出新的要求。

为了缓存结果,有很多方法可以根据您想要的行为进行缓存。要仅缓存单个请求,我建议不要使用#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的参数是初始值。对于这两个运营商,当第一个订户到达时将发出请求。下一个订阅者将获得缓存的答案。

在其他回答中,建议使用主题。出版行为是在幕后使用主题。但是直接调用NEXT(),除非没有其他补救措施,否则它将被认为是不好的做法,而在我看来,这种情况并非如此。即使您直接使用主题,也最好使用#asObservable()操作符将可观察对象返回给组件,这样组件就不会访问下一个、错误和完整的方法。

 类似资料:
  • 我使用Redux和RxJS Angular(4)实现来管理状态 我正在监听一个事件(产品列表中选定产品ID的更改),所以我们称之为selectedproductId$。 当相关发射器发出一个新的selectedId值时,我想从这个可观察值中执行一个,以及从另外两个可观察值中发出的最新值(比如;和)。 因此,触发更改应该是selectedproductID,我们将使用product详细信息和prod

  • 下面的代码基于@a.bertucci提供的一个示例,这里使用Android上的RxJava以固定的间隔在UI中绘制对象,其中我使用计时器压缩了一个可观察对象。当我通过调用processDelayedItems()触发订阅时,压缩的Observable中的代码[A]只执行一次,一个项目被发送到[B]。我原本希望代码[A]在触发后继续运行,并保持每1500毫秒发出一次项,但显然它在这里只运行一次。 >

  • 我想计算单个可观测物体的排放量之间的差异。 如果一个可观测的物体发出一个新的值,有没有办法同时得到它当前和以前的发射?我想要这样的东西: 我该怎么做呢?我是否需要将每个发射存储在一个上限变量中,或者是否有一种奇特的RxJS方法来实现这一点?

  • 本文向大家介绍system.reactive 为可观察值中的每个值选择一个新值,包括了system.reactive 为可观察值中的每个值选择一个新值的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 我想我一定是误解了一些基本的东西,因为在我看来,这应该是一个可观察事物最基本的情况,但在我的一生中,我无法从文件中找出如何做到这一点。 基本上,我希望能够做到这一点: 但是我一直没能找到像这样的方法。我将此用于单击处理程序,我知道他们有,但我正试图将其与React一起使用,我宁愿能够简单地在回调中更新数据流,而不是使用完全不同的事件处理系统。所以基本上我想要这个: 我得到的最接近的是使用,但这似乎

  • 我有一个行为主题和两个事件发射器。每当BehaviorSubject发出新值或任一EventEmitter发出事件时,我需要创建一个Observable,它返回BehaviorSubject的最新值。基本上,我并不关心EventEmitter发出的事件的值,它们应该只是一个触发器,以推出BehaviorSubject的最新值。 下面是一个例子: