Javascript 可观察事件限制/仅在内存中保留一个事件/背压

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:

我已经订阅了每n秒产生一次事件的计时器

可观测间隔(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可以自动终止令牌,并且在其中只存储一个令牌。非常感谢您宝贵的帮助!很高兴它对你有用。保持微笑,观察到的东西有时很难让人理解。但它们太强大了!:)