我希望有一个可观察到的,当发生明显的变化或间隔发生时会发射。
用例是我想在所选实体发生更改时加载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.
答案 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)
...
)