У меня есть угловое приложение, которое должно синхронизировать некоторые данные с сервером при некоторых условиях (некоторые триггеры в программном обеспечении или по запросу пользователя). Итак, у меня есть такая функция:
...
public createSyncObservable(): Observable<any> {
return this.retriveDataFromStorage().pipe(
switchMap(
(data) => forkJoin(this.api.sendData1(data.data1),this.api.sendData2(data.data2),this.api.sendData3(data.data3))
),
switchMap(
(data) => this.api.getDataFromServer()
),
switchMap(
(data) => this.updateLocal(data)
)
)
}
Поведение, которое я хочу, это:
- Если пользователь (или какой-либо триггер) запрашивает синхронизацию, и она уже происходит, я не должен делать это снова, просто дождитесь окончания текущей синхронизации и верните тот же наблюдаемый (общий).
- Если последняя синхронизация уже завершена, она должна начаться снова (создать новую наблюдаемую).
Мое лучшее решение на данный момент - сделать что-то вроде этого (непроверенный код):
...
public syncData(): Observable<any> {
if (this.observable_complete) {
this.observable_complete = false;
this.syncObservable$ = this.createSyncObservable().pipe(share())
this.syncObservable$.subscribe(
(data) => {this.observable_complete = true}
)
}
return this.syncObservable$;
}
Это путь? Может быть, мне не хватает какого-то оператора RxJS, который помог бы мне в этом случае? Это решение кажется немного хакерским...