我正在寻找 RxJS (v6.x) 中的一种方法来向服务器发送循环请求,比如每 30 秒一次{ timer } from 'rxjs',但问题是我没有考虑请求本身的时间。例如,如果返回响应 10 秒,那么请求之间的间隔将是在计时器设置中设置的 30 + 10 等待响应。
也许 RxJS 中的某些类正好适合这样的任务?调用将如下所示:
export class UserService {
constructor(private readonly api: ApiService) {}
public readonly user$ = new ReplaySubject<IUser>(1);
...
private load(): void {
this.api.getUser() // getUser(): Observable<IUser>
.subscribe(user => this.user$.next(user));
}
}
对于这样的缓存,您需要组织一个具有上述行为的调用计时器,也许在 RxJS 中有合适的东西不是拐杖?
也就是说,接下来的 30 秒倒计时应该只有在收到来自后面的响应后才开始,无论它可能是什么。
(ps不要问为什么在这种地方没有使用web sockets,我没有写)
你的任务不是微不足道的,但仍然:)
这里的时刻也很重要——如果你设置了 10 秒的间隔,那么如果服务器 10 秒没有响应怎么办?有几个选项,这就是为什么需要映射到内部投影的所有运算符的原因
switch|merge|concat|exhaustMap。了解任务并从您将使用的要求出发,这一点很重要。让我们看一下这个例子:interval会每300ms产生一次事件,switchMap订阅interval和投影() => timer(400),而它只订阅interval1次,每次interval产生一个事件就投影一次,结果是死循环,不能等待事件的产生fromtimer(400),因为它interval(300)更快地生成事件。mergeMap将创建并发订阅,concatMap创建队列,exhaustMap忽略源(interval(300)),直到timer(400)它触发一个事件。在您的情况下,您需要从任务的要求开始,您比我更了解,但是让我们看一下示例:
我们不要取数字 30。我花了 3 秒的时间间隔,如果它
() => this.api.getUser()生成事件(返回响应)晚于interval(3000)生成新事件,那么它将concatMap向队列添加一个新投影。如果您不需要这样做,请使用exhaustMap,他会忽略interval,直到getUser()他回答为止。PS你需要一个普通的
BehaviorSubject,而不是ReplaySubject。