我正在开发一个会话服务,用于检查认证令牌是否过期。如果过期,会进行刷新令牌的调用。在此请求期间,所有传入的请求都应该排队,并在请求完成后一起处理。之后,所有传入的请求可以继续通过而无需排队,直到令牌再次过期。我为此画了一个大理石图表:
我将1.称为
到目前为止我做了什么?我认为这可以通过添加一个中间的Observable来完成,称为
1. ---a---b---c--d-----e--
2. -t-------f------t------
3. ---a---b---------cd-e--
我将1.称为
incoming$
可观察对象,2.是valve$
- 如果它为true,则请求可以通过,如果它为false,则应该排队。当它变为true时,排队的请求会被触发。到目前为止我做了什么?我认为这可以通过添加一个中间的Observable来完成,称为
receiver$
,它根据valve$
的值改变自己的值。当valve$
为true时,它只返回一个简单的主题,如果它为false,则返回一个能够记录值的主题。receiver$ = valve.pipe(
map((value) => {
if (value) {
return new Subject();
} else {
return (new Subject()).pipe(
shareReplay(),
);
}
})
);
然后,incoming$
中获取的每个新值都应添加到 recevier$
中的当前 observable 中:
incoming$.pipe(
combineLatest(receiver$),
).subscribe((incomingValue, recevier) => {
recevier.next(incomingValue);
});
这里有一部分我无法理解。每当 valve 变为 true 时,我需要从 receiver$
中获取最后两个值。倒数第二个值将保存队列,最后一个值将保存活动主题。通过合并它们,我可以实现我的目标。我不知道如何实现这个功能以及如何管理订阅。此外,对于这样一个看似简单的用例来说,这看起来过于复杂。
实现这种行为的最佳方式是什么?