Условие вложенной подписки Angular, основанное на подтверждении диалога

#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» сохраняет строки.