我在这里有一个小问题。我有一个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,
]
答案 0 :(得分:1)
您正在失去this
上下文。做
}).catch(this.handleError.bind(this)
或箭头功能