Эй, я новичок в rxjs и ngrx, и я создаю приложение, используя эти технологии.
Я пытаюсь подумать о том, как создать систему Поллинга, используя наблюдаемые и операторы rxjs.
Я создал базовую систему опросов, которая содержит карту подписок наблюдаемых. каждая наблюдаемая отправка действия каждые 5 секунд для ngrx-эффектов, которые обрабатывают действие и выполняют побочные эффекты, такие как http-вызов, с использованием службы.
Моя проблема в том, что я хочу создать специальный механизм для текущей системы пула, который имеет следующие условия:
1.Первый пул происходит сразу, для этого я использую таймер (0, poolingTime),
или интервал с трубой stratwith (ноль).
2.Пул знает, что должен задержать свой следующий запрос в соответствии со временем предыдущего запроса. Я имею в виду, что, когда предыдущий запрос завершен, возникает второй запрос.
Первое условие, которое я получил в одиночку, второе условие (2) Мне нужна помощь в достижении этого.
Я думаю о debounce или thorder inorder, чтобы выполнить второе условие, но, как я уже сказал, во-первых, у меня нет большого опыта с rxjs.
Вот код моей простой системы объединения
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Subscription } from 'rxjs/Subscription';
import { timer } from 'rxjs/observable/timer';
import { interval } from 'rxjs/observable/interval';
import { throttleTime, debounceTime, startWith, tap, delay } from 'rxjs/operators';
import { Utils } from '../utils';
@Injectable()
export class PoolingService {
private subscriptions: { [id: string]: Subscription };
constructor() {
this.subscriptions = {};
}
public startPooling(time: number, callback: Function): string {
const id = Utils.guid();
const interval$ = interval(time).pipe(tap(tick => console.log("tick", tick))).pipe(startWith(null));
// const interval$ = timer(0, time).pipe(tap(tick => console.log("tick", tick)));
const subscription = interval$.subscribe(() => { callback() });
this.subscriptions[id] = subscription;
return id;
}
public stopPooling(id: string) {
const subscription = this.subscriptions[id];
if (!subscription) {
return;
}
subscription.unsubscribe();
}
}
Вот использование Сервиса опроса:
ngOnInit() {
this.store.select('domains').subscribe((state: any) => {
const { list, lastAddedDomain } = state;
this.markers = list;
this.roots = Utils.list_to_tree(list);
});
this.poolService.startPooling(5000, () => {
this.store.dispatch(new AllHttpActions.HttpActionGet({}, HttpMethods.GET, "/getDomainsForMap", AllDomainActions.FETCH_DOMAINS, Utils.guid()));
});
}