Как синхронизировать действия подписанной функции - PullRequest
0 голосов
/ 15 февраля 2019

Я разрабатываю угловое 7 приложение.У меня есть HTTP-запрос с обработчиком ошибок, вызываемым в функции catchError.В обработчике ошибок мне нужно перевести код статуса http в удобное для пользователя сообщение, для этого я использую ngx-translate.Я хочу, чтобы обработчик ошибок возвращал Observable с переведенным сообщением об ошибке через функцию throwError.Для этого в обработчике ошибок я назначаю переменную в функции подписки TranslateService, поскольку операция является асинхронной, что является лучшим и более чистым способом убедиться, что переменная с переводом готова, прежде чем обработчик ошибок вернетнаблюдаемый?

postRequest(): Observable<any> {
  return this.http.post<any>(reqUrl, body)
    .pipe(...some transformations on data)
    .catchError(this.handlerError.bind(this)) 
}

private handleError(error: HttpErrorResponse | any): Observable<any> {
  let error_message = 'Generic error occurred';
  let error_message_key = '';

  switch (error.status) {
    case 400:
      error_message_key = 't.validation.bad_request';
      break;
    case 401:
      error_message_key = 't.validation.login_credentials_invalid';
      break;
    case 403:
      error_message_key = 't.validation.unauthorized';
      break;

    .....other cases
  }

  if (error_message_key !== '') {
    this.translate.get(error_message_key).subscribe( t => {
       error_message = t;
    });
  }

  return throwError(error_message);
}

1 Ответ

0 голосов
/ 15 февраля 2019

Поскольку catchError обратный вызов должен возвращать поток - вы можете просто переключиться на поток службы перевода.

Подставляя эту часть

if (error_message_key !== '') {
  this.translate.get(error_message_key).subscribe( t => {
     error_message = t;
  });
}

с

if (error_message_key !== '') {
  return this.translate.get(error_message_key)
    .pipe(
      switchMap(throwError)
    )
}

Должно работать.

Обратите внимание, что в зависимости от фактического варианта использования switchMap может не подойти для вас.Поэтому проверьте concatMap и mergeMap , а также

Надеюсь, это поможет

...