Я не совсем уверен в своих знаниях rx js, но похоже, что из-за .pipe(last())
вы смотрите только последний запрос? Я бы порекомендовал вам установить успех только в том случае, если все завершено без ошибок, например
this.apiFca.saveNew(valueForm, this.exclusionDelays)
.subscribe(
res => {
console.log(res);
},
err => {
console.log(err);
},
() => {
this.successMessage = true;
// etc. etc. etc.
});
или, может быть, вместо использования this.successMessage
используйте что-то вроде this.saveState$
, которое будет объектом BehaviorSubject, инициализированным с помощью 'idle' (или какое-то его перечисление), которым управляет ваша функция saveExclusion()
. Таким образом, начало вашей saveExclusion()
функции могло
- set
const saveState$ = this.saveState$
- утверждать, что
saveState$.getValue() === 'in process'
или, если нет, делать что-то с этим, saveState$.next('in process');
, и вы можете изменить свою строку подписки на
this.apiFca.saveNew(valueForm, this.exclusionDelays)
.subscribe(
res => {
if (res !== '200') {
saveState$.next('unexpected result')
} },
err => {
console.log(err);
saveState$.next('error');
},
() => {
if (saveState$.getValue() === 'in process') {
saveState$.next('success');
} }
);
А затем вы также можете подписаться на saveState$
вашего компонента (хотя за пределами компонента вы 'хотел бы предоставить saveState$.asObservable()
, чтобы значения не могли быть введены внешним кодом). Это дает элегантный код, управляемый событиями, при инициализации вашего компонента:
saveState$.pipe(filter(val => val === 'error'))
.subscribe(functionToTellYourUserThereWasAnError);
// if successful, we want other code to know, but immediately change it back to 'idle' even if other code errors
saveState$.pipe(filter(val => val === 'success')
.subscribe(val => saveState$.next('idle'));
// upon success, reset me
saveState$.pipe(filter(val => val === 'success'))
.subscribe(
val => {
this.exclusionDays = [];
// etc. etc.
// setTimeout not needed because set to 'idle' in a different thread.
}
)
Кроме того, я думаю, что ваш шаблон может также отражать и изменять пользовательский интерфейс в ответ на изменения в saveState$
, поэтому ваша кнопка сохранения может может быть включен / отключен в зависимости от того, находится ли saveState в состоянии ожидания, и т. д. c.