Javascript 可观察事件限制/仅在内存中保留一个事件/背压
我已经订阅了每n秒产生一次事件的计时器Javascript 可观察事件限制/仅在内存中保留一个事件/背压,javascript,rxjs,reactive-programming,observable,Javascript,Rxjs,Reactive Programming,Observable,我已经订阅了每n秒产生一次事件的计时器 可观测间隔(1000) .startWith(0) .map(x=>{return'USER';} 我还有其他可以观察到的结果,这些结果从一开始就不可用,需要一些时间来解决。超时事件累积,当其他事件最终触发时,我有大量的请求 .zip(tokenService.token, (privilege: string, token: Token) => { /*get request body*/ } .flatMap((body:
可观测间隔(1000)
.startWith(0)
.map(x=>{return'USER';}
我还有其他可以观察到的结果,这些结果从一开始就不可用,需要一些时间来解决。超时事件累积,当其他事件最终触发时,我有大量的请求
.zip(tokenService.token, (privilege: string, token: Token) => {
/*get request body*/ }
.flatMap((body: any) => { /* perform refresh request */ }
.map( x => { return x.json(); })
.subscribe( json => {
let token = json['token']'
tokenService.setToken(token);
});
有没有办法只保留计时器中的最后一个事件,并丢弃其余的事件
.last()
对我不起作用,因为它只返回一个事件,但随后什么也不返回,我看不到下一个超时事件
也许这不是解决我问题的好角度?我想每n秒刷新一次令牌,并且只有在我手上有有效令牌的情况下才会这样做(现在提供的服务提供可观察的)
编辑:好的,我发现这叫做背压,有一篇文章是关于它的:
但问题仍然存在。您基本上希望根据可观察对象的当前状态重新触发事件。如果令牌有效且一段时间已过,则应创建一个新令牌,否则不会发生任何事情
请参阅下面提供的一些示例代码,说明如何执行此操作。使用按钮创建新的有效令牌。从那时起,每秒将生成一个新令牌(有效期为5秒)。一旦通过“无效”按钮使令牌无效,新令牌的生成将停止
function createToken() {
// Here you would do some (async) things to get a valid token.
return Promise.resolve({ validUntil: new Date(+new Date() + 5000) });
}
function isTokenValid(token) {
const date = new Date();
return token.validUntil > date;
}
// Subject holds copy of latest token.
const token$ = new Rx.ReplaySubject(1);
// Defines the time interval to periodically query new tokens.
const period$ = Rx.Observable.interval(1000);
period$
.withLatestFrom(token$, (p, token) => {
if (isTokenValid(token)) {
createToken()
.then(token => token$.next(token));
}
return token;
})
.filter(token => isTokenValid(token))
.subscribe(x => console.log(x));
// Button stream that invalidates token
const invalidateBtn$ = Rx.Observable.fromEvent(
document.getElementById('invalidateBtn'), 'click')
.subscribe(() => {
token$.next({ validUntil: new Date(0) });
});
// Button stream triggers creation of first valid token
const createBtn$ = Rx.Observable.fromEvent(
document.getElementById('createBtn'), 'click')
.subscribe(() => {
createToken()
.then((token) => token$.next(token));
});
如果没有清晰的问题陈述、bin和/或大理石图,这些都很难提供帮助。这是一个bin。使用Zip操作符,不会出现“大量请求”请说得更具体些。zip是个坏主意,最新的From+筛选器似乎解决了我所有的问题。我想知道我怎么没有找到它,我以为我已经尝试了所有的方法。但似乎有更酷的方法可以做到这一点:ReplaySubject可以自动终止令牌,并且在其中只存储一个令牌。非常感谢您宝贵的帮助!很高兴它对你有用。保持微笑,观察到的东西有时很难让人理解。但它们太强大了!:)