#angular #rest
#angular #rest
Вопрос:
Я использую следующие версии: Angular CLI: 10.0.6 Узел: 12.18.2 ОС: win32 x64
Angular: 10.0.10
У меня есть следующее требование. В принципе, у меня есть 3 уровня или вызова.
- 1-й вызов службы для проверки, выходят ли дублирующиеся данные или нет. Он вернет пустой массив, если он не существует.
- 2-й, чтобы проверить, возвращает ли вышеупомянутая служба данные, я открою диалоговое окно, предупреждающее пользователя о том, что данные дублируются. Пользователь может отменить -> никаких действий. Другой пользователь может подтвердить -> на основе этого, 3-й вызов, где мне нужно вызвать другую службу; которая будет иметь свою собственную простую подписку и обработку ошибок.
- Если дубликат не найден (на основе 2-го вызова), перейдите к сохранению.
Итак, мой последний вызов службы должен зависеть от «Подтверждения» диалога ИЛИ дубликат не найден?
Я пытаюсь сделать что-то вроде приведенного ниже, но не могу его получить.
// Other code
this.myService.loadDuplicateData(requestPayload) // First call
.pipe(
switchMap(
data => {
this.existingData = data;
if (this.existingData.dbData.length > 0) { // If data exists, ask for confirmation. Do nothing if Cancel, else proceed with 3rd call.
// Means data is already available.
let dialogRef = this.dialog.open(AlertDialogComponent);
// Here I will call afterClosed which has subscribe and pipe option
// what should I return here, so it can be subscribe to the above "pipe"
}
}
)
).subscribe { // subscribe for the pipe
// Ideally 3rd service call will be called if no duplicate OR confirm to save irrespective of duplicate. Should not be called if "Cancel" dialog.
}
———— ОБНОВЛЕНИЕ ———
Я попробовал следующее:
this.myService.getExistingData(requestPayload)
.pipe(
switchMap(
data => {
if(data.existingData.length > 0) {
let dialogRef = this.dialog.open(AlertDialogComponent);
return dialogRef.afterClosed().pipe(
map(
res => {
if (res == 'confirm') {
return of(data);
} else {
return never();
}
}
),
);
}
}
),
switchMap(
data => {
console.log("Second switchmap: " data);
return this.myService.loadUploads(requestPayload);
}
)
).subscribe(
data => {
this.resetRows();
this.isSuccess = true;
},
error => {
//check error
}
);
-
Теперь диалоговое окно появляется, если найдены повторяющиеся данные. Однако, если нажать «Отмена» или «Подтвердить» (оба варианта), данные будут сохранены. Как я не должен продолжать, если нажал «Отмена»?
-
Если дубликат не найден, выдается ошибка «ОШИБКА TypeError: вы указали ‘undefined’ там, где ожидался поток. Вы можете предоставить наблюдаемый, обещание, массив или итерируемый.». Это потому, что у меня нет «else», если дубликат не найден. Как с этим справиться, т.е. Что вернуть, если мне нужно сохранить записи, если дубликатов нет?
метод «loadUploads» сохраняет строки.