RxJS明显的throttleTimer

时间:2018-01-27 15:05:08

标签: rxjs rxjs5

我希望有一个可观察到的,当发生明显的变化或间隔发生时会发射。

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

答:每次路线变更时用户选择实体。

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-- 

我尝试了很多方法,但没有一个工作。使用外部变量可以想到的所有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.

2 个答案:

答案 0 :(得分:2)

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

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

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

您似乎确实不需要使用任何throttleTime

答案 1 :(得分:0)

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)
      ...
  )