【发布时间】:2018-10-26 09:29:35
【问题描述】:
我正在开发一个会话服务来检查身份验证令牌是否已过期。如果是,它会调用刷新令牌。在此请求期间,所有传入请求都应排队,并在请求完成后发出。之后,所有传入的请求都可以在没有队列的情况下通过,直到令牌再次过期。我为此画了一个大理石图:
1. ---a---b---c--d-----e--
2. -t-------f------t------
3. ---a---b---------cd-e--
我将 1. 命名为 incoming$ Observable,2. 命名为 valve$ - 如果为 true,则请求可以通过,如果为 false,则应排队。当它变为真时,队列被触发。
到目前为止我做了什么?我认为这应该通过添加一个名为receiver$ 的中间 Observable 来完成,它会根据valve$ 改变其值。当valve$为真时,它只返回一个简单的主题,如果它是假的,它返回一个能够记录值的主题。
receiver$ = valve.pipe(
map((value) => {
if (value) {
return new Subject();
} else {
return (new Subject()).pipe(
shareReplay(),
);
}
})
);
然后在incoming$ 中获得的每个新值都应该添加到recevier$ 中的当前可观察对象中:
incoming$.pipe(
combineLatest(receiver$),
).subscribe((incomingValue, recevier) => {
recevier.next(incomingValue);
});
这是我无法理解的部分。每当阀门变为真时,我需要来自receiver$ 的最后两个值。倒数第二个将持有队列,最后一个将持有活动主题。通过合并它们,我可以实现我的目标。我不知道如何实现这一点以及如何管理订阅。此外,对于这样一个看似简单的用例,这看起来过于复杂。
实现此行为的最佳方式是什么?
【问题讨论】:
-
大约一年前我使用 egghead.io 用 RxJs 做一些高级的东西。 (大部分我现在都忘记了——因为我在做其他事情!)也许看看那个或尝试使用一些谷歌功夫来追踪作者的博客。
标签: javascript rxjs angular-httpclient