Вы можете использовать switchMap
и concatMap
для этого случая:
manualSave$ = new Subject<any>();
constructor(private http: HttpClient) { }
ngOnInit() {
this.manualSave$.pipe(
switchMap(() => timer(0, 3 * 1000)),
concatMap(() => this.makeRequest())
).subscribe(result => {
console.log(result);
})
this.manualSave$.next(); // to start it off
}
save() {
this.manualSave$.next();
}
makeRequest() {
const url = 'https://jsonplaceholder.typicode.com/todos/1';
return this.http.get(url);
}
Что происходит, это:
---1---2---3---4---5---6---...
-----X------X------------X-...
switchMap // Preserves 3 second interval after every save
// Unless interrupted by a manual save
---A-B---A--B---A---A---AB-... // A: http request generated from autosave
// B: http request generated from manual save
concatMap
---ResResResRes-Res-Res-ResRes-...
// Concats one request only after the last one is finished
Я предпочитаю использовать switchMap
вместо слияния, потому что merge
делает это:
---1----2----3----4----5----6---...
-----X--------X-------------X---...
merge
---1-X--2----3X---4----5----(6X)...
Пока switchMap
отменяет предыдущие значения и делает это:
---1----2----3----4----5----6---...
-----X--------X-------------X---...
switchMap
---1-X----2---X----4----5---X---...
только делает необходимое количество запросов.