RxJS 不同的 throttleTimer

RxJS distinct throttleTimer

我想要一个可观察对象,它在进行明显更改或间隔命中时触发。

用例是我想在 selected 实体更改时加载 http 请求,但在指定的时间内应该重新加载它。

A:用户 select 每次路由更改时的实体。

B:区间。

C:预期输出。

A: --2--2--2--2--2--2--2--3--3--3--2--2--2--2--2--
B: --------1--------2--------3--------4--------5--
C: --2-----2--------2-----3--3-----2--2--------2-- 

我尝试了很多方法,但其中 none 行得通。我能想到的所有 throttleTime 和 distinct 与外部变量的组合。

编辑:

另一种情况表明 C 不必被触发,因为它是一个 http 请求。

A: --2--2--------------2--3--3-----------2--------
B: --------1--------2--------3--------4--------5--
C: --2-----------------2--3--3-----------2-------- 

C 的输出:

2: triggered as A wants to run the http request.
-: not triggered as it is too close (in time) to request before.
-: just the timer ticks.
-: just the timer ticks.
2: triggered as being far away from (in time) the request before.
3: triggered as different id for the http request.
3: triggered as the timer ticked and http request can be sent.
-: just the timer ticks.
2: loaded
-: just the timer ticks.

我认为您可以使用 combineLatest 运算符

const $b = Observable.timer(0, xyz);

$c = a$
  .distinctUntilChanged()
  .combineLatest($b, val => val);

看来你真的不需要使用任何 throttleTime

withLatestFrom 是在不订阅其触发器的情况下从 obervavble 连接数据的正确方法。

工作代码:

loadTimer = timer(0, 60000); //b$
c$ = a$.pipe(
  withLatestFrom(this.loadTimer, (action, timerValue) => ({ action, timerValue })),
  distinctUntilChanged((a, b) => a.action.payload === b.action.payload && a.timerValue === b.timerValue),
  tap(a => console.log(a)),
  map(a => a.action),
  exhaustMap(action =>
    this.businessLoaderService
      .load(action.payload)
      ...
  )