如何同步已订阅功能的动作

时间:2019-02-15 09:49:17

标签: angular asynchronous rxjs observable

我正在开发一个angular 7应用程序。我有一个http post请求,其中包含一个在catchError函数中调用的错误处理程序。 在错误处理程序中,我需要在用户友好的消息中转换http状态代码,为此我使用ngx-translate。我希望错误处理程序通过throwError函数返回带有翻译后的错误消息的Observable。为此,在错误处理程序中,我在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 :(得分:0)

由于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可能不适合您。因此,还要检查concatMapmergeMap

希望这会有所帮助

相关问题