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