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)
...
)
我想要一个可观察对象,它在进行明显更改或间隔命中时触发。
用例是我想在 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)
...
)