服务不会在catch API角度块中自动注入

时间:2018-08-18 14:02:08

标签: angular typescript

我在这里有一个小问题。我有一个api服务,可从API加载数据。

const API_URL = environment.apiUrl;

@Injectable()
export class ApiService {
    private headers = new HttpHeaders({
        'Content-type': 'application/json'
    });

  constructor(
      private http: HttpClient,
      private alertService: AlertService
  ) { }

  public getHotelById(hotelId: number) {
      return this.http
          .get(API_URL + '/hotel/' + hotelId)
          .map((response) => {
              return response;
          }).catch(this.handleError)
  }

  public getHotelsPreview(): Observable<any> {
      return this.http
          .get(API_URL + '/hotels/preview')
          .map( (response) => {
              console.log(this.alertService);
              return response;
          })
  }


  private handleResponse(response:any) {
      console.log(response.headers);
  }

  private handleError (response: Response | any) {
      const error = response.error;

      if(error.messages != null && error.messages.length > 0) {
          const errorMessages = error.messages;

          for(let message of errorMessages) {
              let alert = new Alert();
              alert.message = message.messageContent;

              switch (message.messageType) {
                  case "info":
                      alert.type = AlertType.Info;
                      break;
                  case "warning":
                      alert.type = AlertType.Warning;
                      break;
                  case "success":
                      alert.type = AlertType.Success;
                      break;
                  default:
                      alert.type = AlertType.Error
              }
              this.alertService.constructAlert(alert);
          }
      }

      return Observable.throw(error);
  }

}

发生问题时,我使用catch捕获响应(如您在gethotelbyid方法上看到的那样),并在handleerror方法中进行处理。它基本上只是加载消息并将其推送到警报服务中(警报服务仅在页面上显示所有引导警报,但这并不重要)。

问题是警报服务的注入。当我尝试在handleError方法中控制台日志警报服务时,该服务的未定义。当我尝试在其他地方(例如,在getHotelsPreview()方法中)控制台登录警报服务时,它仅显示了alertservice对象,并且一切正常。我可以调用它的方法,等等。

为什么会这样?我需要使用该服务将数据发送到其中,但我不能。因为某些原因。 我是否需要以不同方式将其注入到catch块中?我真的不明白。应该在构造类时将其注入(这样就需要很长时间才能返回来自API的实际响应)。

要在项目附近完成信息,我将所有服务包含在app.module.ts中

  providers: [
      AlertService,
      ApiService,
  ]

1 个答案:

答案 0 :(得分:1)

您正在失去this上下文。做

    }).catch(this.handleError.bind(this)

或箭头功能