Как связать эти методы? - PullRequest
0 голосов
/ 08 апреля 2019

Я создал сервисный метод, в котором я могу проверить, существует ли данный идентификатор компании в моей базе данных ... этот метод просто возвращает true или false:

    public checkIfOndernemingsnummerAlreadyExists(ondernemingsnummer: string): Observable<boolean> {
        const url = `${environment.apiUrl}/ondernemingen/exists/${ondernemingsnummer}`;
        return this.http.get<boolean>(url);
    }

Теперь я создал своего рода мастера, в котором пользователь может создать новую компанию за определенные шаги.

На первом этапе пользователь должен ввести идентификационный номер компании. Переходя к следующему шагу, я хотел бы проверить, существует ли этот заданный идентификационный номер в моей базе данных.

Если он не существует, пользователь может перейти к следующему шагу в мастере. Если он существует, должно появиться предупреждающее сообщение, и пользователь должен просто остаться на текущем шаге мастера.

Поэтому я добавил следующий код при отправке идентификаторов компании на первом шаге:

public submitOnderneming(): void {
    this.loading = false;
    this.isDuplicate = false;

    of(true).pipe(
      tap(() => this.loading = true),
      switchMap(() => this.kandidatuurService.checkIfOndernemingsnummerAlreadyExists(this.onderneming.ondernemingsnummer)),
      tap((res) => { this.isDuplicate = res; }),
      switchMap(() => { if (this.isDuplicate !== true) { return this.requestService.selectOnderneming(this.onderneming); }})
    ).subscribe(v => { this.loading = false; this.ref.detectChanges(); });
  }

Но это дает мне следующую ошибку:

Вы указали «неопределенное» там, где ожидался поток. Вы можете предоставить Observable, Promise, Array или Iterable.

Теперь я думаю, это потому, что во 2-й switchMap я возвращаю значение только тогда, когда isDuplicate не является истиной. В другом случае я ничего не возвращаю.

Мой requestService.selectOnderneming выглядит так:

    public selectOnderneming(onderneming: OndernemingDetail): Observable<RequestSteps> {
        this.store.dispatch(new SetOndernemingOfRequest(onderneming));
        return this.gotoNextStep();
    }

Так что же следует писать внутри switchMap, когда isDuplicate равен true? Или я должен полностью изменить свой код?

Чего я хочу достичь:

  1. установить для свойства загрузки значение true
  2. call kandidatuurService.checkIfOndernemingsnummerAlreadyExists
  3. на основе этого результирующего набора свойство isDuplicate
  4. когда это не повторяющийся вызов requestService.selectOnderneming
  5. когда все закончено, установите для свойства загрузки значение false

Ответы [ 3 ]

1 голос
/ 08 апреля 2019

Возможно, есть лучшее решение, но для надежно работающей версии:

this.loading = true;
this.kandidatuurService.checkIfOndernemingsnummerAlreadyExists(this.onderneming.ondernemingsnummer)
 .pipe(tap((isDuplicate) => this.isDuplicate = isDuplicate),
       switchMap((isDuplicate) => (isDuplicate ? of(true) : this.requestService.selectOnderneming(this.onderneming))))
 .subscribe(v => { this.loading = false; this.ref.detectChanges(); });
0 голосов
/ 08 апреля 2019

Хорошо, я реализовал предложение следующим образом:

    this.loading = true;

    this.kandidatuurService.checkIfOndernemingsnummerAlreadyExists(this.onderneming.ondernemingsnummer)
      .pipe(
        tap((isDuplicate) => this.isDuplicate = isDuplicate),
        filter(x => x !== true),
        switchMap(() => this.requestService.selectOnderneming(this.onderneming))
      ).subscribe(v => { this.loading = false; this.ref.detectChanges(); });

, но теперь окончательная подписка не выполняется, когда она дублируется ... Это не совсем то, что я хотел ...

0 голосов
/ 08 апреля 2019

Нет необходимости в двух switchMaps, история реактивов начинается с первого запроса, вы можете сделать его началом вашей цепочки.Отфильтруйте ответы, которые являются дубликатами, затем switchMap, и это должно быть.

Редактировать: как написано ниже, filter должен заботиться о флаге loading при возврате false, потому что никто больше не будет иметьвозможность.

this.loading = true;

this.kandidatuurService.checkIfOndernemingsnummerAlreadyExists(this.onderneming.ondernemingsnummer)
    .pipe(
        filter(
            //... logic checking for duplicates here
        ),
        switchMap(() => this.requestService.selectOnderneming(this.onderneming))
    )
    .subscribe( // subscribers here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...