У меня есть следующий бит кода, который устанавливает состояние внутри магазина:
public savePref(setting: SomeSetting): void {
this.update({
data: {
saveSuccess: null
},
loading: true,
error: null
});
this.apiService
.savePrefs(setting)
.pipe(
switchMap(
(changeResponsePrefs) => {
const changedPrefs =
changeResponsePrefs.events[0].data.output.preferences;
const meta = this.stateValue.data.meta;
const prefs = this.stateValue.data.prefs;
return forkJoin([of(meta), of(prefs), of(changedPrefs)]);
}
),
map(
([meta, oldPrefs, newPrefs]) => {
const updatedPrefs = merge(oldPrefs, newPrefs);
return {
...updatedPrefs
};
}
),
tap(data => {
this.update({
data: {
...data,
saveSuccess: {
success: true
}
},
loading: false
});
}),
catchError(error => {
this.update({
data: {
saveSuccess: {
success: false
}
},
loading: false,
error: {
...error,
savePrefsError: true
}
});
return EMPTY;
}),
take(1)
)
.pipe(
delay(10000), // issue is here
finalize(() =>
this.update({
data: { saveSuccess: null }
})
),
take(1)
)
.subscribe();
}
В зависимости от того, успешно ли выполняется сохранение, я устанавливаю saveSuccess
- я использую это значениев другом месте для отображения предупреждения с сообщением об ошибке или об успешном завершении.
Проблема заключается в том, что если вы активируете эту функцию, сообщение об успехе / ошибке будет отображаться в течение 10 секунд (как и ожидалось);но если во время этого ожидания вы перейдете к сохранению другого предпочтения и снова запустите savePref()
, сообщение об успехе / ошибке исчезнет после истечения предыдущих 10 секунд.Я пытаюсь выяснить, как начинать новую задержку при каждом запуске этой функции - эффективно отменяя предыдущую задержку выбросов.
Я подписываюсь на saveSuccess
примерно так:
public get saveSuccess$(): Observable<any> {
return this.state$.pipe(map(state => state.data.saveSuccess));
}
где я использую его как часть async
трубы в шаблоне.
Возможно ли что-то подобное?