Javascript 使ReplaySubject仅返回subscribe上的最后一个值

Javascript 使ReplaySubject仅返回subscribe上的最后一个值,javascript,rxjs,replaysubject,Javascript,Rxjs,Replaysubject,我有一个奇怪的用例,需要跟踪所有以前发出的事件 多亏了ReplaySubject,到目前为止它工作得非常好。在每个新订阅者上,此主题重新发出以前的每个事件 现在,对于一个特定的场景,我需要能够只给出最新发布的事件(有点像BehaviorSubject),但保持源事件相同 以下是我试图实现的一个片段: 谢谢为什么不在EventManager上创建一个ReplaySubject和BehaviorSubject的实例呢 import { ReplaySubject, BehaviorSubject,

我有一个奇怪的用例,需要跟踪所有以前发出的事件

多亏了ReplaySubject,到目前为止它工作得非常好。在每个新订阅者上,此主题重新发出以前的每个事件

现在,对于一个特定的场景,我需要能够只给出最新发布的事件(有点像BehaviorSubject),但保持源事件相同

以下是我试图实现的一个片段:


谢谢

为什么不在
EventManager
上创建一个
ReplaySubject
BehaviorSubject
的实例呢

import { ReplaySubject, BehaviorSubject, from } from "rxjs";

class EventManager {
  constructor() {
    this.replaySubject = new ReplaySubject();
    this.behaviorSubject = new BehaviorSubject();
  }

  publish(value) {
    this.replaySubject.next(value);
    this.behaviorSubject.next(value);
  }

  fullSubscribe(next, error, complete) {
    return this.replaySubject.subscribe(next, error, complete);
  }

  subscribe(next, error, complete) {
    return this.behaviorSubject.subscribe(next, error, complete);
  }
}

如果跟踪已发布事件的数量,可以使用:

订阅(下一步,错误?,完成?){
返回此.mySubject.pipe(
跳过(this.publishCount-1)
).订阅(下一步,错误,完成);
}

这是一个演示。

您可以通过操纵
行为子对象
来获得类似
ReplaySubject
的行为,而不是强制
ReplaySubject
的行为

import{BehaviorSubject,from,concat}from'rxjs';
从“rxjs/operators”导入{scan,shareReplay};
类事件管理器{
构造函数(){
this.mySubject=new BehaviorSubject();
this.allEmittedValues=this.mySubject.pipe(
扫描((xs,x)=>[…xs,x],]),
共享重播(1)
);
//因为我们需要开始积累所有的价值
//马上。
this.allmittedValues.subscribe();
}
处置{
//结束所有订阅
this.mySubject.complete();
}
发布(价值){
this.mySubject.next(值);
}
fullSubscribe(下一步,错误,完成){
//首先,获取累积发射阵列的最新值,然后
//把它展开成一个可观察的形状
const existingEmits$=this.allmittedvalues.pipe(
以(1)为例,
concatMap((发射)=>from(发射))
);
//然后,订阅主主题,跳过重播的值
//我们只是在现有发射的尾端得到它$
const futuremits$=this.mySubject.pipe(跳过(1));
返回concat(existingEmits$,futuremits$)。订阅(
下一个
错误,
完成
);
}
订阅(下一步,错误,完成){
返回this.mySubject.subscribe(下一步,错误,完成);
}
}

因为在现实中,它更复杂。我必须处理一系列问题。通过引入另一个BehaviorSubject,它将极大地增加内存负载。我希望有一个“简单”的方法来处理这个问题。…。@fred.kassi
ReplaySubject
确实使用了大量内存,但是相比之下,
BehaviorSubject
只保留了一个额外的引用,指向已经由
ReplaySubject
保存的值,因此每个
BehaviorSubject
的额外内存基本上是恒定的。除非您出于某种原因发布了非常大的字符串,否则我怀疑您不会注意到内存使用方面的显著差异this@MrkSef不完全是
last()
不会按照他们请求的方式工作,它只会在可观察对象完成之前输出最后发布的事件。OP请求订阅
ReplaySubject
时,“热门”主题立即发出上次发布的事件(如
BehaviorSubject
),而不是像默认值一样向其发布的所有事件。@PatrickRoberts说得好!好的,使用RxJS#
去BounceTime(0)
。我认为
0
应该在这里工作,因为回放是同步进行的。如果不是的话,他可以稍微增加一点去盎司时间。我考虑过去盎司时间(0),问题是如果后续排放发生在同一个刻度上,那么只会收到最后一个。
import { ReplaySubject, BehaviorSubject, from } from "rxjs";

class EventManager {
  constructor() {
    this.replaySubject = new ReplaySubject();
    this.behaviorSubject = new BehaviorSubject();
  }

  publish(value) {
    this.replaySubject.next(value);
    this.behaviorSubject.next(value);
  }

  fullSubscribe(next, error, complete) {
    return this.replaySubject.subscribe(next, error, complete);
  }

  subscribe(next, error, complete) {
    return this.behaviorSubject.subscribe(next, error, complete);
  }
}