Служба вызовов Angular для сохранения данных

#angular #exception #service #httpclient #behavior

#угловатый #исключение #Обслуживание #httpclient httpclient #поведение

Вопрос:

У меня есть форма, которая создает пользователя, и если она уже существует в базе, мне возвращается ошибка, и я открываю всплывающее окно

Моя служба :

   data$ = new BehaviorSubject({
    userList: {},
    user: {},
    create: ''
  });
  
  dispatch(action: Action): Observable<true | { error: string; }> {
    switch (action.type) {
      case ActionTypes.USER_GET_LIST:
        this.getUsers(action.payload);
        return of(true);
      case ActionTypes.USER_CREATE:
        this.createUser(action.payload);
        return of(true);
    }
  }

  private createUser(user: User){
    this.http.post{body : user})
    .subscribe(
        message => this.data$.next({...this.data$.value, create: message}),
        error => {
          this.data$.error(error)
          if (error.error?.title === 'CustomException' amp;amp; error.status === 400) {
            //OPEN POPUP
            return throwError(error);
          } else {
            return throwError(error);
          }   
        }
    ); 
  }
 

Я вызываю службу в своем компоненте :

 this.userService.dispatch({ type: ActionTypes.USER_CREATE, payload: user });
this.userService.data$.asObservable();
this.router.navigate(['/users/user/list']);
 

Моя проблема в том, что он переходит непосредственно на страницу списка, и если возникает ошибка, то на странице списка отображается сообщение if. Я хочу дождаться возврата и быть перенаправленным только в том случае, если ошибки нет

Ответ №1:

Существует несколько проблем с кодом:

a1) this.userService.data$.asObservable();

Это ничего не дает. ...data$.asObservable(); возвращает наблюдаемый объект вашего BehaviourSubject, но вы не присваиваете его переменной и не используете каким-либо другим способом. Трудно сказать, что это означало.

а2) this.userService.dispatch({ type: ActionTypes.USER_CREATE, payload: user });

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

a1) и a2) являются причиной, по которой ваш код устремляется вперед this.router.navigate(['/users/user/list']); . Но до тех пор http-запрос еще не завершен, и все, чего вы хотели достичь с помощью a1), не произошло.

б) switch (action.type) { ... }

Вы вызываете функции в своем коммутаторе, которые имеют асинхронное поведение. Но вы немедленно возвращаете наблюдаемое <логическое значение>, не дожидаясь завершения createUser / getUsers .

c) общий комментарий:

Похоже, что если вы начинаете работать с Observables, ngrx и rxjs.

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

Затем посмотрите, как rxjs позволяет вам работать с наблюдаемыми с помощью .pipe() и rxjs/operators .

Наконец, взгляните на ngrx. Ваша dispatch функция выполняет действия, которые идеально соответствовали бы ngrx / effects, если бы вы подключались к CreateUser вместо подписки.

Комментарии:

1. Каково решение? Можно ли привести пример