Как вернуть переведенное сообщение из подписки в catcherror? - PullRequest
0 голосов
/ 20 декабря 2018

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

Аргумент типа '(error: any) => void' нельзя присвоить параметру типа '(err: any, catch: Observable) => ObservableInput <{}> '.

@Effect()
  login$ = this.actions$.ofType<Login>(AuthActionTypes.Login).pipe(
    map(action => action.payload),
    exhaustMap(auth =>
      this.authService.login(auth).pipe(
        map(data => new LoginSuccess({ data: data })),
        catchError(error => {
          this.translateService
          .get('LoginErrorMessage')
          .subscribe((res: string) => {
            of(new LoginFailure(res));
          });
        }
        )
      )
    )
  );

любая помощь будет оценена.

1 Ответ

0 голосов
/ 20 декабря 2018
  1. Вы получаете эту ошибку, потому что вы ничего не возвращаете из catchError.
  2. Вы должны вернуть Observable, а не подписку, поэтому используйте вместо этого mergeMap() (чтобы сгладить) Observableподписки.
  3. В зависимости от того, хотите ли вы, чтобы получатель этого запроса получил сообщение как об успехе, или вы получили ошибку, чтобы вернуть ошибку или успех.

     @Effect()
      login$ = this.actions$.ofType<Login>(AuthActionTypes.Login).pipe(
        map(action => action.payload),
        exhaustMap(auth =>
          this.authService.login(auth).pipe(
            map(data => new LoginSuccess({ data: data })),
            catchError(error => {
              return this.translateService
              .get('LoginErrorMessage')
              .pipe(
                mergeMap((res: string) => {
                    return of(new LoginFailure(res)); // to get it in success callback
                    // or return throwError(new LoginFailure(res)) // to get it in error call back
                });
              )
            }
            )
          )
        )
      );
    


Обновление

Если вы не хотите вызывать другое наблюдаемое после получения ошибки входа в систему, вам не нужно использовать оператор выравнивания.Нормальный map() подойдет.

     @Effect()
      login$ = this.actions$.ofType<Login>(AuthActionTypes.Login).pipe(
        map(action => action.payload),
        exhaustMap(auth =>
          this.authService.login(auth).pipe(
            map(data => new LoginSuccess({ data: data })),
            catchError(error => {
              return this.translateService
              .get('LoginErrorMessage')
              .pipe(
                map((res: string) => {
                    if (you want the response in success callback) {
                        return new LoginFailure(res);
                    }
                    else {
                        // if you want it in error
                        throw "your error"; // say, {error: "I am Error"}
                    }
                });
              )
            }
            )
          )
        )
      );
...